C#关于序列化和反序列化

C#关于序列化和反序列化,第1张

工具/原料

Visual Studio(本文使用VS2013,其他版本亦可)。

准备工作和类设计

1

启动VS,新建C# 类库项目,并命名为KTools。

2

添加C# Winform项目,命名为Test,重命名主窗口为MainForm,并设置为启动项。同时在KTools项目添加文件夹Serializer,并在该文件夹中添加3个类:XMLSerializer、SoapSerializer和BinarySerializer,如下图:

3

该类库的设计目标是快速方便,最好把序列化和反序列化的方法做成静态方法,这样就可以省去了实例化的步骤。序列化大体上分为序列化到文件和序列化到流,虽然序列化到流更为通用,但序列化到流的步骤中似乎没有什么可简化的,故我们只讨论序列化到文件。对于序列化到文件,我们需要考虑文件是否存在、写入是否覆盖等,为了方便使用只考虑“存在覆盖”的原则。为了尽可能的避免异常(因为这样使用起来更简单,不必考虑是否会引发异常),我们必须确保对象可序列化、文件存在、反序列化时文件不空等。另外,为了避免反序列化时的类型转化,以及更好的使用类,把序列化和范序列化的方法做成泛型。

END

XML序列化和反序列化

1

XML序列化需要引用名称空间System.Xml.Serialization,序列化代码如下:

public static void Serialize<T>(T o, string filePath)

{

try

{

XmlSerializer formatter = new XmlSerializer(typeof(T))

StreamWriter sw = new StreamWriter(filePath, false)

formatter.Serialize(sw, o)

sw.Flush()

sw.Close()

}

catch (Exception) { }

}

2

XML反序列化,代码如下:

public static T DeSerialize<T>(string filePath)

{

try

{

XmlSerializer formatter = new XmlSerializer(typeof(T))

StreamReader sr = new StreamReader(filePath)

T o = (T)formatter.Deserialize(sr)

sr.Close()

return o

}

catch (Exception)

{

}

return default(T)

}

END

Soap序列化

1

Soap序列化需要名称引用空间System.Runtime.Serialization.Formatters.Soap,并且该dll引用需要手工添加。Soap序列化代码,如下:

public static void Serialize<T>(T o, string filePath)

{

try

{

SoapFormatter formatter = new SoapFormatter()

// StreamWriter sw = new StreamWriter(filePath, false)

Stream stream = new FileStream(filePath , FileMode.OpenOrCreate, FileAccess.Write, FileShare.None)

formatter.Serialize(stream, o)

stream.Flush()

stream.Close()

}

catch (Exception) { }

}

2

Soap反序列化,代码如下:

public static T DeSerialize<T>(string filePath)

{

try

{

SoapFormatter formatter = new SoapFormatter()

// StreamReader sr = new StreamReader(filePath)

Stream destream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read)

T o = (T)formatter.Deserialize(destream)

destream.Flush()

destream.Close()

return o

}

catch (Exception)

{

}

return default(T)

}

END

Binary序列化和反序列化

1

Binary序列化,代码:

public static void Serialize<T>(T o, string filePath)

{

try

{

BinaryFormatter formatter = new BinaryFormatter()

Stream stream = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.Write, FileShare.None)

formatter.Serialize(stream, o)

stream.Flush()

stream.Close()

}

catch (Exception) { }

}

2

Binary反序列化,代码:

public static T DeSerialize<T>(string filePath)

{

try

{

BinaryFormatter formatter = new BinaryFormatter()

Stream destream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read)

T o = (T)formatter.Deserialize(destream)

destream.Flush()

destream.Close()

return o

}

catch (Exception)

{

}

return default(T)

}

END

测试

在Test项目中的MainForm窗体中添加两个Button控件,分别命名为“序列化”和“反序列化”,并添加代码:

public partial class MainForm : Form

{

public MainForm()

{

InitializeComponent()

}

private void button1_Click(object sender, EventArgs e)

{

string str = "Hello world!!!"

KTools.Serializer.XMLSerializer.Serialize<string>(str, "1.txt")

MessageBox.Show("序列化完毕")

}

private void button2_Click(object sender, EventArgs e)

{

string str = KTools.Serializer.XMLSerializer.DeSerialize<string>("1.txt")

MessageBox.Show(str)

}

}

调试运行,查看结果:

.NET的序列化其实很简单,通常是在GetObjectData中把要序列化的数据用SerializationInfo的AddValue添加进去.这是MDSN中的一个例子:

public virtual void GetObjectData(

SerializationInfo info, StreamingContext context)

{

if (info == null)

throw new System.ArgumentNullException("info")

info.AddValue("AltName", "XXX")

info.AddValue("AltID", 9999)

}

(http://msdn.microsoft.com/zh-cn/library/system.runtime.serialization.iserializable.getobjectdata.aspx)

另外根据SerializationInfo的成员 *** 作,可以把它看成一个HashTable,它存储了你要序列化的对象数据的键值对,要取出数据只要说明你的键再类型转换即可.

这个是SerializationInfo的成员文档:

http://msdn.microsoft.com/zh-cn/library/system.runtime.serialization.serializationinfo_members(VS.80).aspx

序列化是用来通信的,服务端把数据序列化,发送到客户端,客户端把接收到的数据反序列化后对数据进行 *** 作,完成后再序列化发送到服务端,服务端再反序列化数据后对数据进行 *** 作。

序列化的方法,就我知道的有三种:

(1)二进制序列化【二进制序列化是通过BinaryFormatter类来实现的,这个类位于System.Runtime.Serialization.Formatters.Binary命名空间下。】

(2)XML序列化 【XML序列化是通过XmlSerializer 类来实现的, 这个类位于System.Xml.Serialization命名空间下。】

(3)SOAP序列化【SOAP序列化是通过SoapFormatter类来实现的,这个类位于System.Runtime.Serialization.Formatters.Soap命名空间下,并且需要注意需要手动添加对这个命名空间的引用

---这么久了还没采纳


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11841286.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-19
下一篇 2023-05-19

发表评论

登录后才能评论

评论列表(0条)

保存