【问题标题】:XmlSerializer not serializing custom typeXmlSerializer 不序列化自定义类型
【发布时间】:2011-09-19 10:06:08
【问题描述】:

我正在尝试通过以下代码进行序列化

var data = argsPerCall.ToArray();
var knownTypes = new[] { typeof(int), typeof(int),  
                         typeof(string), typeof(McPosition)};

var serializer = new XmlSerializer(data.GetType(), knownTypes);
// Writing the file requires a TextWriter.
var myStreamWriter = new StreamWriter(filename);
serializer.Serialize(myStreamWriter, data);
myStreamWriter.Close();

我遇到了McPosition 类型的问题。

用于后续输入

5 , 1, "R251" , {1,2,3}

我正在关注序列化

<ArrayOfAnyType>
    <anyType xsi:type="xsd:int">5</anyType>
    <anyType xsi:type="xsd:int">1</anyType>
    <anyType xsi:type="xsd:string">R251</anyType>
    <anyType xsi:type="McPosition" />
  </ArrayOfAnyType>

知道为什么它没有正确序列化吗?

编辑:

public struct McPosition : IComparable<McPosition> {
    private readonly int _station;
    private readonly int _slot;
    private readonly int _subslot;


    public static McPosition Empty = new McPosition(-1, -1, -1);


    public McPosition(int station, int slot, int subslot) {
      _station = station;
      _slot    = slot;
      _subslot = subslot;
    }

等等……

谢谢。

【问题讨论】:

  • McPosition 长什么样子?
  • 你能告诉我们你对McPosition类型的定义吗?

标签: c# .net xml xml-serialization


【解决方案1】:

要通过XmlSerializer 进行序列化,类型上的每个属性必须 有一个公共的getter 和setter(并且没有标记[XmlIgnore] 也没有一个返回false 的ShouldSerialize*() 等) .公共字段也被序列化(只要它们不是readonly),但公开字段更不可取。 XmlSerializer 从不看私人会员。

猜测(编辑:现在由更新的问题确认)McPosition 是一个不可变向量,没有公共设置器。那是行不通的。选项:

  • 实现IXmlSerializable(老实说,并不太好)
  • 将公共设置器添加到McPosition
  • 使用完全可变的单独 DTO

【讨论】:

    【解决方案2】:

    您必须为 XML 可序列化字段添加公共 getter 和 setter。这里:站、槽和子槽。

    【讨论】:

      猜你喜欢
      • 2010-12-31
      • 1970-01-01
      • 1970-01-01
      • 2011-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-06
      • 1970-01-01
      相关资源
      最近更新 更多