我在这里找到了几个关于序列化的线程,但他们没有回答我的问题。
我需要一个简单的序列化库,它会反映标有某些属性的属性,并将它们的值存储为字符串。所有属性都是直接字符串或直接转换为字符串(内置值类型,bool等)。它还应该理解简单容器(如通用列表)并序列化这些内容。
我需要的序列化控件是指示要序列化的属性(只有那些用属性修饰的属性)并且我还必须能够指示某些属性被序列化为最后一个:在序列化期间它们必须是也被反序列化为最后一个。
格式无关紧要,正常param1=val1, param2=val2
会做,JSON也会这样做,以及XML甚至是转义或编码的二进制格式。重要的是,我可以将所有设置放在一个字符串中,我可以在应用程序中轻松存储和加载。
有什么想法吗?
答案 0 :(得分:3)
DataContractSerializer
执行此操作 - 您使用[DataContract]
修饰要序列化的类,并且仅使用[DataMember]
序列化的成员。您还可以通过DataMember属性的Order
属性控制序列化的顺序。
DataContractSerializer(DCS)总是将对象序列化为 XML ,但它使用的XML既可以是带标签的“普通”XML,也可以是更紧凑的二进制格式,具体取决于XmlWriter你在序列化期间传递给它(和反序列化期间的XmlReader)。另一个让你对生成的XML进行更多控制的选项(但它不是高效的)是XmlSerializer
类,它有自己的属性来控制序列化。
下面的代码显示了DCS可序列化类型及其序列化的示例:
[DataContract]
public class Person
{
[DataMember(Order = 1)]
public string Name;
[DataMember(Order = 2)]
public int Age;
[DataMember(Order = 3)]
public Address Address;
}
[DataContract]
public class Address
{
[DataMember(Order = 1)]
public string Street;
[DataMember(Order = 2)]
public string City;
[DataMember(Order = 3)]
public string State;
}
public static void Test()
{
MemoryStream ms = new MemoryStream();
XmlWriterSettings ws = new XmlWriterSettings
{
Indent = true,
IndentChars = " ",
Encoding = Encoding.UTF8,
};
XmlWriter w = XmlWriter.Create(ms, ws);
DataContractSerializer dcs = new DataContractSerializer(typeof(Person));
Person person = new Person
{
Name = "John",
Age = 22,
Address = new Address
{
Street = "1 Main St.",
City = "Springfield",
State = "ZZ",
}
};
dcs.WriteObject(w, person);
w.Flush();
Console.WriteLine("Serialized:");
Console.WriteLine(Encoding.UTF8.GetString(ms.ToArray()));
ms.Position = 0;
XmlReader r = XmlReader.Create(ms);
Person deserialized = (Person)dcs.ReadObject(r);
Console.WriteLine(deserialized);
}
答案 1 :(得分:2)
如果JSON会这样做,请查看JSON.Net:http://json.codeplex.com/
答案 2 :(得分:1)
您还可以查看YAX序列化程序:http://www.codeproject.com/KB/XML/yaxlib.aspx