使用XMLRoot / XMLElement和使用Serializable()属性有什么区别? 我怎么知道何时使用?
答案 0 :(得分:30)
这是一个不太深入的描述,但我认为这是一个很好的起点。
XmlRootAttribute
- 用于为将要作为被序列化的对象图的根元素的类提供模式信息。这只能应用于类,结构,枚举,返回值的接口。
XmlElementAttribute
- 提供类的属性的架构信息,控制它们如何序列化为子元素。此属性只能应用于字段(类变量成员),属性,参数和返回值。
前两个XmlRootAttribute
和XmlElementAttribute
与XmlSerializer相关。
而下一个,由运行时格式化程序使用,在使用XmlSerialization时不适用。
SerializableAtttrible
- 用于指示类型可以由运行时格式化程序(如SoapFormatter或BinaryFormatter)序列化。只有在需要使用其中一个格式化程序序列化类型时才需要这样做,并且可以应用于委托,枚举,结构和类。
这是一个可能有助于澄清上述内容的简单示例。
// This is the root of the address book data graph
// but we want root written out using camel casing
// so we use XmlRoot to instruct the XmlSerializer
// to use the name 'addressBook' when reading/writing
// the XML data
[XmlRoot("addressBook")]
public class AddressBook
{
// In this case a contact will represent the owner
// of the address book. So we deciced to instruct
// the serializer to write the contact details out
// as <owner>
[XmlElement("owner")]
public Contact Owner;
// Here we apply XmlElement to an array which will
// instruct the XmlSerializer to read/write the array
// items as direct child elements of the addressBook
// element. Each element will be in the form of
// <contact ... />
[XmlElement("contact")]
public Contact[] Contacts;
}
public class Contact
{
// Here we instruct the serializer to treat FirstName
// as an xml element attribute rather than an element.
// We also provide an alternate name for the attribute.
[XmlAttribute("firstName")]
public string FirstName;
[XmlAttribute("lastName")]
public string LastName;
[XmlElement("tel1")]
public string PhoneNumber;
[XmlElement("email")]
public string EmailAddress;
}
鉴于上述情况,使用XmlSerializer序列化的AddressBook实例将提供以下格式的XML
<addressBook>
<owner firstName="Chris" lastName="Taylor">
<tel1>555-321343</tel1>
<email>chris@guesswhere.com</email>
</owner>
<contact firstName="Natasha" lastName="Taylor">
<tel1>555-321343</tel1>
<email>natasha@guesswhere.com</email>
</contact>
<contact firstName="Gideon" lastName="Becking">
<tel1>555-123423</tel1>
<email>gideon@guesswhere.com</email>
</contact>
</addressBook>