繁体   English   中英

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

[英]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>
{    
}

兴趣点; 每个继承FieldValidatorFieldValidator必须使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM