.Net对象的轻量级字符串序列化

时间:2011-06-29 03:00:32

标签: c# .net xml json serialization

我在这里找到了几个关于序列化的线程,但他们没有回答我的问题。

我需要一个简单的序列化库,它会反映标有某些属性的属性,并将它们的值存储为字符串。所有属性都是直接字符串或直接转换为字符串(内置值类型,bool等)。它还应该理解简单容器(如通用列表)并序列化这些内容。

我需要的序列化控件是指示要序列化的属性(只有那些用属性修饰的属性)并且我还必须能够指示某些属性被序列化为最后一个:在序列化期间它们必须是也被反序列化为最后一个。

格式无关紧要,正常param1=val1, param2=val2会做,JSON也会这样做,以及XML甚至是转义或编码的二进制格式。重要的是,我可以将所有设置放在一个字符串中,我可以在应用程序中轻松存储和加载。

有什么想法吗?

3 个答案:

答案 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