使用 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
属性,结果仍然相同。
查看图片。
为什么呢? Serializable
属性没用?
答案 0 :(得分:2)
使用XmlSerializer时,使用[Serializable] attribut
标记类型非常重要
这是不正确的。只有一些序列化程序依赖于该属性,但不依赖于XmlSerializer。
请注意,.NET框架中的各种序列化程序之间存在许多不一致之处。有些人会调用默认的构造函数/执行字段初始值设定项,有些则不会。有些人会将私人会员序列化,有些则不会。有些使用SerializableAttribute,有些则没有。
How does WCF deserialization instantiate objects without calling a constructor?
阅读您正在使用的序列化程序的细节以避免意外。