XmlSerializer没有序列化自定义类型

时间:2011-09-19 10:06:08

标签: c# .net xml xml-serialization

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

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;
    }

等...

谢谢。

2 个答案:

答案 0 :(得分:5)

要通过XmlSerializer进行序列化,类型的每个媒体资源必须都有公共的getter和setter(并且不会被标记为[XmlIgnore],也不会有ShouldSerialize*()返回false等)。公共字段也是序列化的(只要它们不是readonly),但是暴露字段更不可取。 XmlSerializer永远不会看私人会员。

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

  • 实施IXmlSerializable(不要过于乐观,说实话)
  • 将公共制定者添加到McPosition
  • 使用完全可变的单独DTO

答案 1 :(得分:2)

您必须为XML可序列化字段添加公共getter和setter。这里:车站,老虎机和子地槽。