C#实现的序列化通用类实例
本文实例讲述了C#实现的序列化通用类。分享给大家供大家参考。具体如下:
usingSystem;
usingSystem.IO;
usingSystem.IO.Compression;
usingSystem.Runtime.Serialization.Formatters.Binary;
usingSystem.Runtime.Serialization.Formatters.Soap;
usingSystem.Text;
usingSystem.Xml;
usingSystem.Xml.Serialization;
namespacePlatForm.Utilities
{
publicenumSerializedType:ushort
{
ByteArray=0,
Object=1,
String=2,
Datetime=3,
Bool=4,
//SByte=5,//Makesnosense.
Byte=6,
Short=7,
UShort=8,
Int=9,
UInt=10,
Long=11,
ULong=12,
Float=13,
Double=14,
CompressedByteArray=255,
CompressedObject=256,
CompressedString=257,
}
publicclassSerializeHelper
{
publicSerializeHelper()
{}
#regionXML序列化
///<summary>
///文件化XML序列化
///</summary>
///<paramname="obj">对象</param>
///<paramname="filename">文件路径</param>
publicstaticvoidSave(objectobj,stringfilename)
{
FileStreamfs=null;
try
{
fs=newFileStream(filename,FileMode.Create,FileAccess.Write,FileShare.ReadWrite);
XmlSerializerserializer=newXmlSerializer(obj.GetType());
serializer.Serialize(fs,obj);
}
catch(Exceptionex)
{
throwex;
}
finally
{
if(fs!=null)fs.Close();
}
}
///<summary>
///文件化XML反序列化
///</summary>
///<paramname="type">对象类型</param>
///<paramname="filename">文件路径</param>
publicstaticobjectLoad(Typetype,stringfilename)
{
FileStreamfs=null;
try
{
fs=newFileStream(filename,FileMode.Open,FileAccess.Read,FileShare.ReadWrite);
XmlSerializerserializer=newXmlSerializer(type);
returnserializer.Deserialize(fs);
}
catch(Exceptionex)
{
throwex;
}
finally
{
if(fs!=null)fs.Close();
}
}
///<summary>
///文本化XML序列化
///</summary>
///<paramname="item">对象</param>
publicstringToXml<T>(Titem)
{
XmlSerializerserializer=newXmlSerializer(item.GetType());
StringBuildersb=newStringBuilder();
using(XmlWriterwriter=XmlWriter.Create(sb))
{
serializer.Serialize(writer,item);
returnsb.ToString();
}
}
///<summary>
///文本化XML反序列化
///</summary>
///<paramname="str">字符串序列</param>
publicTFromXml<T>(stringstr)
{
XmlSerializerserializer=newXmlSerializer(typeof(T));
using(XmlReaderreader=newXmlTextReader(newStringReader(str)))
{
return(T)serializer.Deserialize(reader);
}
}
#endregion
#regionSoapFormatter序列化
///<summary>
///SoapFormatter序列化
///</summary>
///<paramname="item">对象</param>
publicstaticstringToSoap<T>(Titem)
{
SoapFormatterformatter=newSoapFormatter();
using(MemoryStreamms=newMemoryStream())
{
formatter.Serialize(ms,item);
ms.Position=0;
XmlDocumentxmlDoc=newXmlDocument();
xmlDoc.Load(ms);
returnxmlDoc.InnerXml;
}
}
///<summary>
///SoapFormatter反序列化
///</summary>
///<paramname="str">字符串序列</param>
publicstaticTFromSoap<T>(stringstr)
{
XmlDocumentxmlDoc=newXmlDocument();
xmlDoc.LoadXml(str);
SoapFormatterformatter=newSoapFormatter();
using(MemoryStreamms=newMemoryStream())
{
xmlDoc.Save(ms);
ms.Position=0;
return(T)formatter.Deserialize(ms);
}
}
#endregion
#regionBinaryFormatter序列化
///<summary>
///BinaryFormatter序列化
///</summary>
///<paramname="item">对象</param>
publicstaticstringToBinary<T>(Titem)
{
BinaryFormatterformatter=newBinaryFormatter();
using(MemoryStreamms=newMemoryStream())
{
formatter.Serialize(ms,item);
ms.Position=0;
byte[]bytes=ms.ToArray();
StringBuildersb=newStringBuilder();
foreach(bytebtinbytes)
{
sb.Append(string.Format("{0:X2}",bt));
}
returnsb.ToString();
}
}
///<summary>
///BinaryFormatter反序列化
///</summary>
///<paramname="str">字符串序列</param>
publicstaticTFromBinary<T>(stringstr)
{
intintLen=str.Length/2;
byte[]bytes=newbyte[intLen];
for(inti=0;i<intLen;i++)
{
intibyte=Convert.ToInt32(str.Substring(i*2,2),16);
bytes[i]=(byte)ibyte;
}
BinaryFormatterformatter=newBinaryFormatter();
using(MemoryStreamms=newMemoryStream(bytes))
{
return(T)formatter.Deserialize(ms);
}
}
#endregion
///<summary>
///将对象序列化为二进制字节
///</summary>
///<paramname="obj">待序列化的对象</param>
///<returns></returns>
publicstaticbyte[]SerializeToBinary(objectobj)
{
byte[]bytes=newbyte[2500];
using(MemoryStreammemoryStream=newMemoryStream())
{
BinaryFormatterbformatter=newBinaryFormatter();
bformatter.Serialize(memoryStream,obj);
memoryStream.Seek(0,0);
if(memoryStream.Length>bytes.Length)
{
bytes=newbyte[memoryStream.Length];
}
bytes=memoryStream.ToArray();
}
returnbytes;
}
///<summary>
///从二进制字节中反序列化为对象
///</summary>
///<paramname="type">对象的类型</param>
///<paramname="bytes">字节数组</param>
///<returns>反序列化后得到的对象</returns>
publicstaticobjectDeserializeFromBinary(Typetype,byte[]bytes)
{
objectresult=newobject();
using(MemoryStreammemoryStream=newMemoryStream(bytes))
{
BinaryFormatterserializer=newBinaryFormatter();
result=serializer.Deserialize(memoryStream);
}
returnresult;
}
///<summary>
///将文件对象序列化到文件中
///</summary>
///<paramname="obj">待序列化的对象</param>
///<paramname="path">文件路径</param>
///<paramname="fileMode">文件打开模式</param>
publicstaticvoidSerializeToBinary(objectobj,stringpath,FileModefileMode)
{
using(FileStreamfs=newFileStream(path,fileMode))
{
//ConstructaBinaryFormatteranduseittoserializethedatatothestream.
BinaryFormatterformatter=newBinaryFormatter();
formatter.Serialize(fs,obj);
}
}
///<summary>
///将文件对象序列化到文件中
///</summary>
///<paramname="obj">待序列化的对象</param>
///<paramname="path">文件路径</param>
publicstaticvoidSerializeToBinary(objectobj,stringpath)
{
SerializeToBinary(obj,path,FileMode.Create);
}
///<summary>
///从二进制文件中反序列化为对象
///</summary>
///<paramname="type">对象的类型</param>
///<paramname="path">二进制文件路径</param>
///<returns>反序列化后得到的对象</returns>
publicstaticobjectDeserializeFromBinary(Typetype,stringpath)
{
objectresult=newobject();
using(FileStreamfileStream=newFileStream(path,FileMode.Open))
{
BinaryFormatterserializer=newBinaryFormatter();
result=serializer.Deserialize(fileStream);
}
returnresult;
}
///<summary>
///获取对象的转换为二进制的字节大小
///</summary>
///<paramname="obj"></param>
///<returns></returns>
publicstaticlongGetByteSize(objectobj)
{
longresult;
BinaryFormatterbFormatter=newBinaryFormatter();
using(MemoryStreamstream=newMemoryStream())
{
bFormatter.Serialize(stream,obj);
result=stream.Length;
}
returnresult;
}
///<summary>
///克隆一个对象
///</summary>
///<paramname="obj">待克隆的对象</param>
///<returns>克隆的一个新的对象</returns>
publicstaticobjectClone(objectobj)
{
objectcloned=null;
BinaryFormatterbFormatter=newBinaryFormatter();
using(MemoryStreammemoryStream=newMemoryStream())
{
try
{
bFormatter.Serialize(memoryStream,obj);
memoryStream.Seek(0,SeekOrigin.Begin);
cloned=bFormatter.Deserialize(memoryStream);
}
catch//(Exceptione)
{
;
}
}
returncloned;
}
///<summary>
///从文件中读取文本内容
///</summary>
///<paramname="path">文件路径</param>
///<returns>文件的内容</returns>
publicstaticstringReadFile(stringpath)
{
stringcontent=string.Empty;
using(StreamReaderreader=newStreamReader(path))
{
content=reader.ReadToEnd();
}
returncontent;
}
publicstaticbyte[]Serialize(objectvalue,outSerializedTypetype,uintcompressionThreshold)
{
byte[]bytes;
if(valueisbyte[])
{
bytes=(byte[])value;
type=SerializedType.ByteArray;
if(bytes.Length>compressionThreshold)
{
bytes=compress(bytes);
type=SerializedType.CompressedByteArray;
}
}
elseif(valueisstring)
{
bytes=Encoding.UTF8.GetBytes((string)value);
type=SerializedType.String;
if(bytes.Length>compressionThreshold)
{
bytes=compress(bytes);
type=SerializedType.CompressedString;
}
}
elseif(valueisDateTime)
{
bytes=BitConverter.GetBytes(((DateTime)value).Ticks);
type=SerializedType.Datetime;
}
elseif(valueisbool)
{
bytes=newbyte[]{(byte)((bool)value?1:0)};
type=SerializedType.Bool;
}
elseif(valueisbyte)
{
bytes=newbyte[]{(byte)value};
type=SerializedType.Byte;
}
elseif(valueisshort)
{
bytes=BitConverter.GetBytes((short)value);
type=SerializedType.Short;
}
elseif(valueisushort)
{
bytes=BitConverter.GetBytes((ushort)value);
type=SerializedType.UShort;
}
elseif(valueisint)
{
bytes=BitConverter.GetBytes((int)value);
type=SerializedType.Int;
}
elseif(valueisuint)
{
bytes=BitConverter.GetBytes((uint)value);
type=SerializedType.UInt;
}
elseif(valueislong)
{
bytes=BitConverter.GetBytes((long)value);
type=SerializedType.Long;
}
elseif(valueisulong)
{
bytes=BitConverter.GetBytes((ulong)value);
type=SerializedType.ULong;
}
elseif(valueisfloat)
{
bytes=BitConverter.GetBytes((float)value);
type=SerializedType.Float;
}
elseif(valueisdouble)
{
bytes=BitConverter.GetBytes((double)value);
type=SerializedType.Double;
}
else
{
//Object
using(MemoryStreamms=newMemoryStream())
{
newBinaryFormatter().Serialize(ms,value);
bytes=ms.GetBuffer();
type=SerializedType.Object;
if(bytes.Length>compressionThreshold)
{
bytes=compress(bytes);
type=SerializedType.CompressedObject;
}
}
}
returnbytes;
}
privatestaticbyte[]compress(byte[]bytes)
{
using(MemoryStreamms=newMemoryStream())
{
using(DeflateStreamgzs=newDeflateStream(ms,CompressionMode.Compress,false))
{
gzs.Write(bytes,0,bytes.Length);
}
ms.Close();
returnms.GetBuffer();
}
}
privatestaticbyte[]decompress(byte[]bytes)
{
using(MemoryStreamms=newMemoryStream(bytes,false))
{
using(DeflateStreamgzs=newDeflateStream(ms,CompressionMode.Decompress,false))
{
using(MemoryStreamdest=newMemoryStream())
{
byte[]tmp=newbyte[bytes.Length];
intread;
while((read=gzs.Read(tmp,0,tmp.Length))!=0)
{
dest.Write(tmp,0,read);
}
dest.Close();
returndest.GetBuffer();
}
}
}
}
publicstaticobjectDeSerialize(byte[]bytes,SerializedTypetype)
{
switch(type)
{
caseSerializedType.String:
returnEncoding.UTF8.GetString(bytes);
caseSerializedType.Datetime:
returnnewDateTime(BitConverter.ToInt64(bytes,0));
caseSerializedType.Bool:
returnbytes[0]==1;
caseSerializedType.Byte:
returnbytes[0];
caseSerializedType.Short:
returnBitConverter.ToInt16(bytes,0);
caseSerializedType.UShort:
returnBitConverter.ToUInt16(bytes,0);
caseSerializedType.Int:
returnBitConverter.ToInt32(bytes,0);
caseSerializedType.UInt:
returnBitConverter.ToUInt32(bytes,0);
caseSerializedType.Long:
returnBitConverter.ToInt64(bytes,0);
caseSerializedType.ULong:
returnBitConverter.ToUInt64(bytes,0);
caseSerializedType.Float:
returnBitConverter.ToSingle(bytes,0);
caseSerializedType.Double:
returnBitConverter.ToDouble(bytes,0);
caseSerializedType.Object:
using(MemoryStreamms=newMemoryStream(bytes))
{
returnnewBinaryFormatter().Deserialize(ms);
}
caseSerializedType.CompressedByteArray:
returnDeSerialize(decompress(bytes),SerializedType.ByteArray);
caseSerializedType.CompressedString:
returnDeSerialize(decompress(bytes),SerializedType.String);
caseSerializedType.CompressedObject:
returnDeSerialize(decompress(bytes),SerializedType.Object);
caseSerializedType.ByteArray:
default:
returnbytes;
}
}
}
}
希望本文所述对大家的C#程序设计有所帮助。