.Net对象的轻量级字符串序列化
本文关键字:字符串 序列化 轻量级 对象 Net | 更新日期: 2023-09-27 18:00:42
我阅读了在这里找到的几个关于序列化的线程,但它们没有回答我的问题。
我需要一个简单的序列化库,它将反映出用特定属性标记的属性,并将它们的值存储为字符串。所有属性要么是直接字符串,要么可以直接转换为字符串(内置值类型、bool等)。它还应该理解简单的容器(如泛型列表)并序列化这些内容。
我需要对序列化进行控制,以指示要序列化的属性(只有那些用属性修饰的属性),并且我还必须能够指示某些属性被序列化为最后一个属性:在序列化过程中,它们也必须被反序列化为最后的属性。
格式并不重要,只是普通的param1=val1, param2=val2
可以,JSON也可以,还有XML,甚至转义或编码的二进制格式。重要的是,我可以把所有的设置放在一个字符串中,我可以很容易地在应用程序中存储和加载。
有什么想法吗?
DataContractSerializer
会这样做-您装饰要用[DataContract]
序列化的类,并且只装饰要用[DataMember]
序列化的成员。您还可以通过DataMember属性的Order
属性控制序列化的顺序。
DataContractSerializer(DCS)始终将对象序列化为XML,但它使用的XML既可以是带标记的"普通"XML,也可以是更紧凑的二进制格式,这取决于序列化期间传递给它的XmlWriter(以及反序列化期间传递的XmlReader)。另一个选项是XmlSerializer
类,它可以让您对生成的XML有更多的控制权(但它没有那么高性能),它有自己的属性来控制序列化。
下面的代码显示了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);
}
如果JSON可以,请查看JSON.Net:http://json.codeplex.com/
您还可以查看YAX序列化程序:http://www.codeproject.com/KB/XML/yaxlib.aspx