泛型集合的序列化和反序列化

上传人:ji****72 文档编号:37961055 上传时间:2018-04-25 格式:DOC 页数:6 大小:45.50KB
返回 下载 相关 举报
泛型集合的序列化和反序列化_第1页
第1页 / 共6页
泛型集合的序列化和反序列化_第2页
第2页 / 共6页
泛型集合的序列化和反序列化_第3页
第3页 / 共6页
泛型集合的序列化和反序列化_第4页
第4页 / 共6页
泛型集合的序列化和反序列化_第5页
第5页 / 共6页
点击查看更多>>
资源描述

《泛型集合的序列化和反序列化》由会员分享,可在线阅读,更多相关《泛型集合的序列化和反序列化(6页珍藏版)》请在金锄头文库上搜索。

1、泛型集合的序列化和反序列化泛型集合的序列化和反序列化1. 泛型集合的序列化比较简单,和普通对象没有两样,但是.net FrameWork 里面没有提供现成的 API,这是一个我自己封装的一个方法,采用了 object 作为被序列化对象的参数类型,亦即可以接受任意类型的对象,并通过调 用 GetType 方法获得被序列化对象的转换前的类型(或者说是被序列化对 象的真正类型,object 在 c#里是所有对象的基类),牺牲了一点点类型转 换带来的性能损失,但是带来了很好的封装性,易用性。我简单了做了个 对比测试,写了一个以具体类型作为参数的序列化方法,(方法内代码一 模一样),序列化一个简单对象,

2、重复执行 1 万次,相差大概 10 毫秒级, 只要你对性能要求不是特别苛刻,我觉得都适合采用。/ / 序列化成 xml 字符串/ / / 序列化后的字符串public string Serialize(object obj)XmlSerializer xs = new XmlSerializer(obj.GetType();using (MemoryStream ms = new MemoryStream()System.Xml.XmlTextWriter xtw = new System.Xml.XmlTextWriter(ms, System.Text.Encoding.UTF8);xtw

3、.Formatting = System.Xml.Formatting.Indented;xs.Serialize(xtw, obj);ms.Seek(0, SeekOrigin.Begin);using (StreamReader sr = new StreamReader(ms)string str = sr.ReadToEnd();xtw.Close();ms.Close();return str;调用代码举例如下:public class classApublic string name get; set; public string address get; set; List li

4、st = new List() new classA() name = “1“, address = “2“ , new classA name = “2“, address = “3“ ;string s = Serialize(list);s = Serialize(new classA() name = “1“, address = “2“ );2. 现在重点来说说集合对象的反序列化。翻遍了 MSDN 上关于序列化和反序列 化的文章,都是长篇大论教你怎么序列化和反序列化一个对象,唯独没有 讨论怎么序列化和反序列化集合对象的, 更别提泛型集合了。当我在 xml 文件里直接录入两个结构一模一

5、样的节点 时,IDE 智能感应提示我 xml 文件里必须有而且是唯一的一个根节点,也就 是说,如果你想反序列化一个对象数组, 如 classA,你还必须得在 xml 文件里最外层节点套一个像 这样的根节点,反序列化以后得到 root 对象,通过读取这个 root 对象的 属性才能得到这个对象数组, 有没有直接一点的办法呢?于是我调用前面写好的序列化方法,把一个集 合对象序列化成字符串,得到的字符串形式如下.,看到这里,相信聪明的读者也领悟到了,只要往 xml 文件按这种格式编写, 把 root 替换成 ArrayOfClassA(注意这里 classA 首字母变成大写了),反序 列化时候就能直

6、接得到 classA,对于 List也一样。所以,xml 文件编写格式举例如下: FrameWork 里既有对 xml 字符串的反序列化方法,也有对 xml 文件的 反序列化方法,对比了一下代码,无非就是流读取对象不一样,一个是 StringReader,StreamReader,而他们都继承于 TextReader ,我干脆把它 们都集合为一个方法。反序列化的封装方法如下:/ / 反序列化方法/ / xml 字符串 / 反序列化对象的类型 / 反序列化后的对象public object Desrialize(string xml, Type type)object obj = null;Xm

7、lSerializer xs = new XmlSerializer(type);TextReader tr;if (!File.Exists(xml)tr = new StringReader(xml);elsetr = new StreamReader(xml);using (tr)obj = xs.Deserialize(tr);return obj; 调用代码如下 List list = Desrialize(“xxx.xml“,typeof(List) as List;当然也可反序列化单个对象 classA item = Desrialize(“xxx.xml“,typeof(cla

8、ssA) as classA;然而,这里还是觉得不够完美,因为泛型没用上啊:/ / 反序列化方法/ / 反序列化对象类型/ 反序列化字符串或者 xml 文件路径/ public T Desrialize(string xml)T obj = default(T);XmlSerializer xs = new XmlSerializer(typeof(T);TextReader tr;if (!File.Exists(xml)tr = new StringReader(xml);elsetr = new StreamReader(xml);using (tr)obj = (T)xs.Deseri

9、alize(tr);return obj;调用代码如下 List list = Desrialize(“xxx.xml“);当然也可反序列化单个对象 classA item = Desrialize(“xxx.xml“);=首先你的 Users 对象必须是再 Client 端和 Server 端共享的 DLL 来的,而且要可序列化,根 据你的问题我建了三个 Project: 1.ClassLibrary1.dll,放 User class,在 Client 端和 Server 都同时引用它。Serializablepublic class Userspublic int Age get; se

10、t; public string Name get; set; public object Sex get; set; public object Address get; set; public ulong Phone get; set; public object Content get; set; 2.client projectclass Programprivate static UdpClient udpClient;static void Main(string args)udpClient = new UdpClient();SendData();Console.Read();

11、public static void SendData()try/定义对方主机和端口IPEndPoint ipPoint = new IPEndPoint(IPAddress.Parse(“127.0.0.1“), 9800);/实例化并赋值 Users user = new UsersName = “test“,Sex = “1“,Age = 27,Address = “127.0.0.1“,Phone = 13698756236,Content = “test“;List list = new List();list.Add(user);/序列化集合Stream s = new Memor

12、yStream();BinaryFormatter bf = new BinaryFormatter(); /二进制方式bf.Serialize(s, list); /序列化保存配置文件对象 listbyte by = new bytes.Length;s.Position = 0;s.Read(by, 0, by.Length);/发送udpClient.Send(by, by.Length, ipPoint);Console.WriteLine(“success!“);catch (Exception ex)Console.WriteLine(ex.ToString();3.Server:

13、 class Programprivate static UdpClient udpClient;static void Main(string args)udpClient = new UdpClient(9800); /这里 Server 端的监听端口必须是 Client 发送的端 口ReceiveData();Console.Read();private static void ReceiveData()IPEndPoint point = new IPEndPoint(IPAddress.Any, 0);/接收数据,储存在 byte 数组里byte bytes = udpClient.Receive(ref point);Stream s = new MemoryStream(bytes);BinaryFormatter bf = new BinaryFormatter();List list = bf.Deserialize(s) as List; /获取Console.WriteLine(list0.Name + “ “ + list0.Address);

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号