如何将类对象序列化为xml文档
本文关键字:xml 文档 序列化 对象 | 更新日期: 2023-09-27 18:21:33
我希望从您那里找到解决方案。我需要的是将ValidatorList类对象序列化为xml文档。如何做到这一点?
我试过这样:
XmlSerializer _serializer = new XmlSerializer(list);
但我不知道如何为有几个类的列表输出xml。
C#
_list= new ListVal();
Type _type = typeof(ras);
_list.Add(new RequiredField
{
Property = _type.GetProperty("CustRef")
}.Add(new AsciiVal()));
_list.Add(new RequiredField
{
Property = _type.GetProperty("ctr")
}.Add(new StringLengthVal
{
min= 3,
max= 3
}));
[Serializable]
public class Field
{
public Field Next
{
get;
set;
}
public Field TypeName
{
get;
set;
}
public Field PropertyName
{
get;
set;
}
}
public class RequiredField : Field
{
//TODO
}
public class AsciiVal: Field
{
//TODO
}
public class StringLengthVal: Field
{
//TODO
}
public class ListVal: List<Field>
{
//TODO
}
我有一些接近的东西,但不是你想要的Xml。事实上,我想您会看到下面生成的Xml比您现有的更有意义。
为了开始,您可以使用System.Xml.Serialization
命名空间中的属性来控制序列化和反序列化。一些有用的阅读是
XmlRootAttribute
XmlElementAttribute
XmlAttributeAttribute
XmlIncludeAttribute
所以我模拟了一些与你自己的代码非常匹配的代码。请注意,添加了一些属性来指示序列化程序如何布局Xml。
[XmlInclude(typeof(AsciiValidator))]
[XmlInclude(typeof(RequiredValidator))]
[XmlInclude(typeof(StringLengthValidator))]
public class FieldValidator
{
[XmlElement("Next")]
public FieldValidator Next
{
get;
set;
}
[XmlElement("PropertyName")]
public string PropertyName
{
get;
set;
}
}
public class AsciiValidator: FieldValidator
{
}
public class RequiredValidator: FieldValidator
{
}
public class StringLengthValidator: FieldValidator
{
[XmlElement]
public int MinLength{get;set;}
[XmlElement]
public int MaxLength{get;set;}
}
[XmlRoot("ValidatorList")]
public class ValidatorList : List<FieldValidator>
{
}
兴趣点;每个继承FieldValidator
的类都必须使用XmlIncludeAttribute
添加到已知类型的列表中,以便序列化程序知道如何处理它们)
然后我创建了一个示例对象映射:
var test = new ValidatorList();
test.Add(
new RequiredValidator()
{
PropertyName="CustRef",
Next = new AsciiValidator()
});
test.Add(
new RequiredValidator()
{
PropertyName="CurrencyIndicator",
Next = new StringLengthValidator(){
MinLength=3,
MaxLength = 10
}
});
最后,我告诉序列化程序将其序列化(并将结果输出到控制台)
var ser = new XmlSerializer(typeof(ValidatorList));
ser.Serialize(Console.Out,test);
结果是:
<?xml version="1.0" encoding="utf-8"?>
<ValidatorList xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<FieldValidator xsi:type="RequiredValidator">
<Next xsi:type="AsciiValidator" />
<PropertyName>CustRef</PropertyName>
</FieldValidator>
<FieldValidator xsi:type="RequiredValidator">
<Next xsi:type="StringLengthValidator">
<MinLength>3</MinLength>
<MaxLength>10</MaxLength>
</Next>
<PropertyName>CurrencyIndicator</PropertyName>
</FieldValidator>
</ValidatorList>
离你想要的不到一百万英里。需要以某种方式输出某些内容(例如xsi:type
告诉序列化器如何反序列化回对象映射)。我希望这能给你一个良好的开端。
以下是一个实际的工作示例:http://rextester.com/OXPOB95358
反序列化可以通过调用XmlSerializer上的Deserialize
方法来完成。
例如,如果您的xml位于字符串中:
var ser = new XmlSerializer(typeof(ValidatorList));
var test = "<..../>" // Your Xml
var xmlReader = XmlReader.Create(new StringReader(test));
var validatorList = (ValidatorList)ser.Deserialize(xmlReader);
反序列化有许多重写,根据数据是在流、现有读取器中还是保存到文件中,这些重写会接受不同的输入。
您必须用KonwnType属性装饰包含_validators字段的类
[Serializable]
[KwownType(typeof(RequiredFieldValidator)]
[KwownType(typeof(AsciValidator)]
public class MySerialisableClass
我有几个SO答案,详细介绍了如何使用XML序列化对象。我将在下面提供链接。
然而,由于您正在寻找一个相当简单的对象序列化,您可能需要阅读DataContractSerializer
。它远没有旧的.NET1.xXML序列化复杂。
以下是SO答案列表:
- 在.NET中序列化对象时,是否省略所有xsi和xsd命名空间
- XmlSerializer:删除不必要的xsi和xsd命名空间
- 在.Net中序列化时,抑制xsi:nil,但仍显示Empty元素
- 对嵌套属性使用XmlAttributeOverrides
尽管其中许多都与XML序列化和名称空间有关,但它们包含了使用.NET1.xXMLSerialization将对象序列化为XML的完整示例。