在课前删除[Serializable]属性

时间:2015-01-19 18:57:29

标签: c# serialization

使用 XmlSerializer 时,请务必使用[ Serializable ]属性标记类型,< em> SerializableAttribute class。

class Program
{
    static void Main(string[] args)
    {
        XmlSerializer serializer = new XmlSerializer(typeof(Person));
        string xml;
        using (StringWriter stringWriter = new StringWriter())
        {
            Person p = new Person
            {
                FirstName = "John",
                LastName = "Doe",
                Age = 42
            };
            serializer.Serialize(stringWriter, p);
            xml = stringWriter.ToString();
        }
        Console.WriteLine(xml);
        using (StringReader stringReader = new StringReader(xml))
        {
            Person p = (Person)serializer.Deserialize(stringReader);
            Console.WriteLine("{0} {1} is {2} years old", p.FirstName, p.LastName, p.Age);
        }
        Console.ReadLine();
    }
}
[Serializable]
public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int Age { get; set; }
}

如您所见, Person 类标有 Serializable 。如果他们不选择退出,该类型的所有成员都会自动序列化。

但是,如果我删除 Serializable 属性,结果仍然相同。

查看图片。

image

为什么呢? Serializable 属性没用?

1 个答案:

答案 0 :(得分:2)

  

使用XmlSerializer时,使用[Serializable] attribut

标记类型非常重要

这是不正确的。只有一些序列化程序依赖于该属性,但不依赖于XmlSerializer。

请注意,.NET框架中的各种序列化程序之间存在许多不一致之处。有些人会调用默认的构造函数/执行字段初始值设定项,有些则不会。有些人会将私人会员序列化,有些则不会。有些使用SerializableAttribute,有些则没有。

How does WCF deserialization instantiate objects without calling a constructor?

阅读您正在使用的序列化程序的细节以避免意外。