删除 class 之前的 [Serializable] 属性

Remove [Serializable] attribute before class

使用 XmlSerializer 时,使用 [Serializable 标记类型很重要]]属性,SerializableAttributeclass.

的一部分
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 class 标记为 Serializable。如果不选择退出,该类型的所有成员都会自动序列化。

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

看图。

为什么? Serializable属性没用?

When working with the XmlSerializer, it is important that you mark your types with the [Serializable] attribut

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

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

How does WCF deserialization instantiate objects without calling a constructor?

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