使用XmlSerializer类将对象序列化为Xml格式保存_支持泛型的Dictionary

 在一个特殊应用中, 我们需要将内存中的一个对象持久化, 而这个对象是来自一个模板类实例化出来的, 不能保存到数据库中, 数据库中只存有此对象的模板.由于使用到泛型的Dictionary, 而XmlSerializer却不支持默认的泛型的Dictionary, 为此我找了些资料, 并在此文中以三种不同的方式实现. 本文中约定: 方案1: 不序列化泛型的Dictionary方案2
摘要由CSDN通过智能技术生成
 

在一个特殊应用中, 我们需要将内存中的一个对象持久化, 而这个对象是来自一个模板类实例化出来的, 不能保存到数据库中, 数据库中只存有此对象的模板.

由于使用到泛型的Dictionary, 而XmlSerializer却不支持默认的泛型的Dictionary, 为此我找了些资料, 并在此文中以三种不同的方式实现. 本文中约定:

方案1: 不序列化泛型的Dictionary

方案2: 定义支持泛型的Dictionary

方案3: 让每个类实现IXmlSerializable接口

本文内容:
1. 类图及类之间的关联
2. 方案1: 不序列化泛型的Dictionary
3. 方案2: 定义支持泛型的Dictionary
4. 方案3: 让每个类实现IXmlSerializable接口
5. 总结


1. 类图及类之间的关联
image

薪酬模板PayTemplate,  它通过Dictionary<int, PayItemTemplate>维持着多个薪酬栏目模板PayItemTemplate. 

而一个PayItemTemplate通过Dictionary<int, PayItemTemplate>记录着那些使用过它的PayItemTemplate.

所以, PayTemplate与PayItemTemplate是一对多关联; PayItemTemplate是一对多的自关联.

方案1,2,3中的类关联都相似, 这里就不重复了. 详细差别可在本文末尾下载源代码查看.



2. 方案1: 不序列化泛型的Dictionary
既然知道了泛型的Dictionary不被XmlSerializer支持, 我们就避免泛型的Dictionary被序列化, 只需要在字段上加上XmlIgnore属性即可.代码如下:

   46         [XmlIgnore] //带有XmlIgnore, 表示序列化时不序列化此属性

   47         public Dictionary<int, PayItemTemplate> PayItemTemplateDic

   48         {

   49             get { return payItemTemplates; }

   50             set { payItemTemplates = value; }

   51         }

好了,  既然让泛型的Dictionary不被序列化了, 而我们的需求中又需要将泛型的Dictionary中的对象序列化到Xml中保存, 那怎么办呢?这里的办法就是加多一个额外的PayItemTemplate[]数组字段, 代码实现如下:

   53         /// <summary>

   54         /// 用于序列化PayItemTemplate集合

   55         /// </summary>

   56         public PayItemTemplate[] PayItemTemplates

   57         {

   58             get

   59             {

   60                 List<PayItemTemplate> list = new List<PayItemTemplate>(payItemTemplates.Count);

   61                 foreach (KeyValuePair<int,PayItemTemplate> pit in payItemTemplates)

   62                 {

   63                     list.Add(pit.Value);

   64                 }

   65 

   66                 return list.ToArray();

   67             }

   68             set

   69             {

   70                 payItemTemplates = new Dictionary<int, PayItemTemplate>();

   71                 foreach (PayItemTemplate pit in value)

   72                 {

   73                     payItemTemplates.Add(pit.Id, pit);

   74                 }

   75             }

   76         }

这就是我们需要做的, 下面进行测试, 具体的单元测试, 可在下载源代码中查看.
测试结果:
正向序列化:

<?xml version="1.0" encoding="utf-8"?>

<PayTemplate xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">

  <Id>100</Id>

  <Name>薪酬模版Test</Name>

  <StartDate>2007-08-16T19:10:43.640625+08:00</StartDate>

  <PayItemTemplates>

    <PayItemTemplate>

      <numbericalCategory

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值