如何将类对象序列化为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。事实上,我想您会看到下面生成的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的完整示例。