在另一个可序列化类中序列化IDictionary

时间:2011-02-11 02:43:21

标签: .net xml-serialization

我们正在尝试序列化一个包含字典的类。

我有可行的代码实现IXmlSerializable来序列化字典但是有点迷失,因为如何使用默认的XMLSerializer序列化对象,然后当它到达字典元素时强制它使用自定义构建的序列化器。

目前,如果我可以提供帮助,我已打折为整个对象构建自定义序列化程序,因为对象可能会在其生命周期内发生变化,我希望尽量减少可能导致未来混淆的自定义。

以下是我尝试序列化的类的减少样本,实际对象要大得多;

public class Report 
{
    public int ID { get; set; }
    public string Name { get; set; }

    //...

    private Dictionary<string, string> _parameters = new Dictionary<string, string>();

}

任何有关这方面的简单方法的建议都会受到重视。

2 个答案:

答案 0 :(得分:1)

不幸的是,IXmlSerializable是一种全有或全无的事情。为了自己做任何事情,您必须为该类型执行所有,这是不理想的。

为了使其变得更难,处理器无法通过泛型来处理太多问题,因此很难使用您控制的某种类型的封装作为解决方法。

答案 1 :(得分:0)

最初的问题出现了,因为我试图为字典的XML序列化找到一个可行的解决方案(特别是驻留在其他对象中的那些)。

与此同时,我找到了一个使用WCF DataContractSerializer的替代选项,它具有序列化字典的功能。最简单的例子是:

using System.Collections.Generic;
using System.IO;
using System.Runtime.Serialization;

namespace CodeSample
{
class Report                        
{
   public int ID { get; set; }
   public string Name { get; set; }
   //...                                                  
   private Dictionary<string, string> _parameters = new Dictionary<string, string>();

   public Dictionary<string, string> Parameters {
       get { return _parameters; }
       set { _parameters = value; }       
   }
}


class StartUp
{
   static void Main()
   {
    System.IO.Stream fStream = new FileStream("C:\\Out.xml" , FileMode.Create);
    Report x = new Report();
    Report y;
    System.IO.Stream rStream;

    // Presuming that Parameters is an exposed reference to the dictionary
    x.Parameters.Add("Param1", "James2");
    x.Parameters.Add("Param2", System.DateTime.Now.ToString());
    x.Parameters.Add("Param3", 2.4.ToString());

    DataContractSerializer dcs = new DataContractSerializer(x.GetType());

    dcs.WriteObject(fStream, x);

    fStream.Flush();
    fStream.Close();

    rStream = new FileStream("C:\\Out.xml", FileMode.Open);

    y = (Report) dcs.ReadObject(rStream);
    //y is now a copy of x
   }
}

}

不确定是否有任何不可预见的缺点。