乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 62|回复: 4

可序列化的泛型集合类

[复制链接]

72

主题

2726

帖子

9

银币

社区元老

Rank: 75Rank: 75Rank: 75

铜币
3014
发表于 2010-1-16 11:57:00 | 显示全部楼层 |阅读模式
经常遇到集合类的序列化和反序列化,所以就有简化的想法,:)
使用Xml序列化时集合类通常被序列化为数组,而忽视掉公共属性,但有时属性是必要了
  1. using System;
  2. using System.IO;
  3. using System.Xml;
  4. using System.Text;
  5. using System.Reflection;
  6. using System.Collections.Generic;
  7. using System.Xml.Serialization;
  8. using System.Runtime.Serialization;
  9. using System.Runtime.Serialization.Formatters.Binary;
  10. namespace TlsCad.Collections
  11. {
  12.     [Serializable]
  13.     public class SerialList : List
  14.     {
  15.         [NonSerialized]
  16.         public Action ItemAdded;
  17.         [NonSerialized]
  18.         public Action ItemRemoving;
  19.         public SerialList()
  20.             : base()
  21.         { }
  22.         public SerialList(IEnumerable lst)
  23.             : base(lst)
  24.         { }
  25.         public virtual void CopyFrom(IEnumerable lst)
  26.         {
  27.             base.AddRange(lst);
  28.             if (ItemAdded != null)
  29.             {
  30.                 foreach (T item in lst)
  31.                 {
  32.                     ItemAdded(item);
  33.                 }
  34.             }
  35.         }
  36.         #region List
  37.         public new virtual void Add(T item)
  38.         {
  39.             base.Add(item);
  40.             if (ItemAdded != null)
  41.             {
  42.                 ItemAdded(item);
  43.             }
  44.         }
  45.         public new virtual void AddRange(IEnumerable items)
  46.         {
  47.             base.AddRange(items);
  48.             if (ItemAdded != null)
  49.             {
  50.                 foreach (T item in items)
  51.                 {
  52.                     ItemAdded(item);
  53.                 }
  54.             }
  55.         }
  56.         public new virtual bool Remove(T item)
  57.         {
  58.             if (ItemRemoving != null && this.Contains(item))
  59.             {
  60.                 ItemRemoving(item);
  61.             }
  62.             return base.Remove(item);
  63.         }
  64.         public new virtual void RemoveRange(int index, int count)
  65.         {
  66.             if (ItemRemoving != null)
  67.             {
  68.                 for (int i = index; i  0 && index  ReadXml(string path)
  69.         {
  70.             if (File.Exists(path))
  71.             {
  72.                 using (XmlTextReader reader = new XmlTextReader(path))
  73.                 {
  74.                     reader.Normalization = false;
  75.                     XmlSerializer xs = new XmlSerializer(GetType());
  76.                     SerialList items = ((SerialList)xs.Deserialize(reader));
  77.                     CopyFrom(items);
  78.                     return items;
  79.                 }
  80.             }
  81.             return null;
  82.         }
  83.         #endregion
  84.         #region Bin
  85.         class UBinder : SerializationBinder
  86.         {
  87.             public override Type BindToType(string assemblyName, string typeName)
  88.             {
  89.                 try
  90.                 {
  91.                     return Type.GetType(typeName);
  92.                 }
  93.                 catch
  94.                 {
  95.                     return Assembly.Load(assemblyName).GetType(typeName);
  96.                 }
  97.             }
  98.         }
  99.         public virtual void WriteTo(string path)
  100.         {
  101.             using (Stream stream = File.Open(path, FileMode.Create))
  102.             {
  103.                 BinaryFormatter bformatter = new BinaryFormatter();
  104.                 bformatter.Serialize(stream, this);
  105.             }
  106.         }
  107.         public virtual SerialList ReadFrom(string path)
  108.         {
  109.             if (File.Exists(path))
  110.             {
  111.                 using (Stream stream = File.Open(path, FileMode.Open))
  112.                 {
  113.                     BinaryFormatter bformatter = new BinaryFormatter();
  114.                     bformatter.Binder = new UBinder();
  115.                     SerialList lst = (SerialList)bformatter.Deserialize(stream);
  116.                     CopyFrom(lst);
  117.                     return lst;
  118.                 }
  119.             }
  120.             return null;
  121.         }
  122.         #endregion
  123.     }}
回复

使用道具 举报

72

主题

2726

帖子

9

银币

社区元老

Rank: 75Rank: 75Rank: 75

铜币
3014
发表于 2010-1-16 11:58:00 | 显示全部楼层
  1. using System;
  2. using System.IO;
  3. using System.Xml;
  4. using System.Text;
  5. using System.Linq;
  6. using System.Xml.Serialization;
  7. using System.Collections.Generic;
  8. using System.Runtime.Serialization;
  9. using System.Runtime.Serialization.Formatters.Binary;
  10. namespace TlsCad.Collections
  11. {
  12.     [Serializable]
  13.     public class SerialList : SerialList
  14.     {
  15.         public TInfo Info { get; set; }
  16.         public SerialList()
  17.             : base()
  18.         { }
  19.         public SerialList(IEnumerable lst)
  20.             : base(lst)
  21.         { }
  22.         public virtual void CopyFrom(SerialList lst)
  23.         {
  24.             Info = lst.Info;
  25.             base.CopyFrom(lst);
  26.         }
  27.         
  28.         #region Xml
  29.         public new virtual void WriteXml(string path)
  30.         {
  31.             XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
  32.             ns.Add("", "");
  33.             using (XmlTextWriter writer = new XmlTextWriter(path, Encoding.UTF8))
  34.             {
  35.                 writer.WriteStartDocument();
  36.                 writer.WriteStartElement("SerialList");
  37.                 writer.WriteStartElement("Info");
  38.                 XmlSerializer xs = new XmlSerializer(typeof(TInfo));
  39.                 xs.Serialize(writer, Info, ns);
  40.                 writer.WriteEndElement();
  41.                 writer.WriteStartElement("Values");
  42.                 xs = new XmlSerializer(typeof(TValue));
  43.                 foreach (TValue item in this)
  44.                 {
  45.                     xs.Serialize(writer, item, ns);
  46.                 }
  47.                 writer.WriteEndElement();
  48.                 writer.WriteEndElement();
  49.                 writer.Close();
  50.             }
  51.         }
  52.         public new virtual SerialList ReadXml(string path)
  53.         {
  54.             if (File.Exists(path))
  55.             {
  56.                 using (XmlTextReader reader = new XmlTextReader(path))
  57.                 {
  58.                     SerialList lst = new SerialList();
  59.                     reader.Normalization = false;
  60.                     reader.ReadToDescendant("Info");
  61.                     reader.Read();
  62.                     XmlSerializer xs = new XmlSerializer(typeof(TInfo));
  63.                     lst.Info = (TInfo)xs.Deserialize(reader);
  64.                     reader.Read();
  65.                     reader.Read();
  66.                     xs = new XmlSerializer(typeof(TValue));
  67.                     while (reader.NodeType != XmlNodeType.EndElement)
  68.                     {
  69.                         TValue item = (TValue)xs.Deserialize(reader);
  70.                         if (item != null)
  71.                         {
  72.                             lst.Add(item);
  73.                         }
  74.                     };
  75.                     reader.Close();
  76.                     CopyFrom(lst);
  77.                     return lst;
  78.                 }
  79.             }
  80.             return null;
  81.         }
  82.         #endregion
  83.         #region Bin
  84.         public new virtual SerialList ReadFrom(string path)
  85.         {
  86.             SerialList lst =
  87.                 (SerialList)base.ReadFrom(path);
  88.             if (lst != null)
  89.             {
  90.                 Info = lst.Info;
  91.             }
  92.             return lst;
  93.         }
  94.         #endregion
  95.     }
  96. }
回复

使用道具 举报

72

主题

2726

帖子

9

银币

社区元老

Rank: 75Rank: 75Rank: 75

铜币
3014
发表于 2010-1-16 11:59:00 | 显示全部楼层
测试代码:复制代码命令行输出:
命令: tt
Add a item:key:1,name:lzh;
Add a item:key:2,name:雪山飞狐;
info from Bin:name:TlsCad,des:This is a test
key:1,name:lzh;
key:2,name:雪山飞狐;
info from Xml:name:TlsCad,des:This is a test
key:1,name:lzh;
key:2,name:雪山飞狐;
回复

使用道具 举报

72

主题

2726

帖子

9

银币

社区元老

Rank: 75Rank: 75Rank: 75

铜币
3014
发表于 2010-1-18 15:15:00 | 显示全部楼层
附上使用该类生成的xml文档(NetAutoLoad中使用的初始化文件)复制代码
回复

使用道具 举报

3

主题

20

帖子

4

银币

初来乍到

Rank: 1

铜币
32
发表于 2010-6-6 18:34:00 | 显示全部楼层
谢谢
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-6-28 22:51 , Processed in 1.911315 second(s), 63 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表