[英]how to serialize class objects to xml document
我希望找到您的解决方案。 我需要将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比您拥有的Xml更具意义。
首先,您可以使用System.Xml.Serialization
命名空间中的属性控制序列化和反序列化。 一些有用的内容是
因此,我模拟了一些与您的代码非常匹配的代码。 请注意,添加了一些属性来指示序列化程序我希望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
类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
方法来完成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);
Deserialize有许多替代项,这些替代项采用不同的输入,具体取决于数据是在Stream中还是现有的阅读器,还是保存到文件中。
您必须用KonwnType属性装饰包含_validators字段的类。
[Serializable]
[KwownType(typeof(RequiredFieldValidator)]
[KwownType(typeof(AsciValidator)]
public class MySerialisableClass
我有几个SO答案,详细说明了如何使用XML序列化对象。 我将在下面提供链接。
但是,由于您正在寻找对象的相当简单的序列化,因此您可能需要阅读DataContractSerializer
。 它比旧的.NET 1.x XML序列化要简单得多。
这是SO答案的列表:
即使其中许多都与XML序列化和名称空间有关,它们仍然包含使用.NET 1.x XML序列化将对象序列化为XML的完整示例。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.