我们正在尝试序列化一个包含字典的类。
我有可行的代码实现IXmlSerializable来序列化字典但是有点迷失,因为如何使用默认的XMLSerializer序列化对象,然后当它到达字典元素时强制它使用自定义构建的序列化器。
目前,如果我可以提供帮助,我已打折为整个对象构建自定义序列化程序,因为对象可能会在其生命周期内发生变化,我希望尽量减少可能导致未来混淆的自定义。
以下是我尝试序列化的类的减少样本,实际对象要大得多;
public class Report
{
public int ID { get; set; }
public string Name { get; set; }
//...
private Dictionary<string, string> _parameters = new Dictionary<string, string>();
}
任何有关这方面的简单方法的建议都会受到重视。
答案 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
}
}
}
不确定是否有任何不可预见的缺点。