我希望找到你的解决方案。我需要的是将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
}
答案 0 :(得分:1)
我有一些接近,但不完全是你想要的Xml。事实上,我认为你会发现下面生成的Xml比你拥有的更有意义。
为了帮助您入门,您可以使用System.Xml.Serialization
namespace中的属性来控制序列化和反序列化。一些有用的内容是
所以我嘲笑了一些与你自己的代码非常匹配的代码。请注意添加一些属性来指示序列化程序我希望如何布置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);
反序列化有许多覆盖,它们采用不同的输入,具体取决于数据是否在Stream中是现有的读取器,还是保存到文件中。
答案 1 :(得分:0)
您必须使用KonwnType属性
修饰包含_validators字段的类[Serializable]
[KwownType(typeof(RequiredFieldValidator)]
[KwownType(typeof(AsciValidator)]
public class MySerialisableClass
答案 2 :(得分:0)
我有几个SO答案,详细说明了如何使用XML序列化对象。我将在下面提供链接。
但是,由于您正在寻找对象的相当简单的序列化,因此您可能需要阅读DataContractSerializer
。它比旧的.NET 1.x XML序列化复杂得多。
以下是SO答案清单:
尽管其中许多与XML序列化和命名空间有关,但它们包含使用.NET 1.x XML序列化将对象序列化为XML的完整示例。