如何将类对象序列化为xml文档

时间:2013-07-09 10:12:52

标签: c# xml xml-serialization

我希望找到你的解决方案。我需要的是将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
  }

3 个答案:

答案 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的完整示例。