【问题标题】:how to serialize class objects to xml document如何将类对象序列化为xml文档
【发布时间】:2013-07-09 10:12:52
【问题描述】:

我希望从您那里找到解决方案。我需要将 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)的过程是序列化反序列化是另一种方式。我已经用正确的短语更新了您的问题,以使其更清晰

标签: c# xml xml-serialization


【解决方案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);

Deserialize 有许多覆盖,它们采用不同的输入,具体取决于数据是在现有阅读器的 Stream 中,还是保存到文件中。

【讨论】:

  • 通过在XmlSerializer 上调用Deserialize 方法之一
  • 我已经尝试过了 - 它不起作用。我想看看你的是什么样的,这样我才能理解。非常感谢你的时间:)
【解决方案2】:

您必须使用 KonwnType 属性装饰包含 _validators 字段的类

[Serializable]
[KwownType(typeof(RequiredFieldValidator)]
[KwownType(typeof(AsciValidator)]
public class MySerialisableClass

【讨论】:

    【解决方案3】:

    我有几个 SO 答案,详细说明了如何使用 XML 序列化对象。我将在下面提供链接。

    但是,由于您正在寻找一个相当简单的对象序列化,您可能需要阅读DataContractSerializer。它比旧的 .NET 1.x XML 序列化要简单得多。

    以下是 SO 答案列表:

    尽管其中许多与 XML 序列化和命名空间有关,但它们包含使用 .NET 1.x XML 序列化将对象序列化为 XML 的完整示例。

    【讨论】:

      猜你喜欢
      • 2011-12-03
      • 2019-03-04
      • 1970-01-01
      • 1970-01-01
      • 2018-10-11
      • 2017-08-20
      • 2011-01-07
      • 2017-07-16
      • 1970-01-01
      相关资源
      最近更新 更多