XmlSerializer不能序列化自定义类型。

3
我正在尝试使用以下代码进行序列化
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;
    }

etc....

Thanks .


McPosition看起来是什么样子? - Marc Gravell
请问您能展示一下 McPosition 类型的定义吗? - Greg B
2个回答

5
要使用XmlSerializer进行序列化,类型中的每个属性必须具有公共getter和setter(不能标记[XmlIgnore]或具有返回false的ShouldSerialize*()等)。公共字段也会被序列化(只要它们不是readonly),但是暴露字段甚至更不可取。 XmlSerializer从不查看私有成员。
猜测(编辑:现在已通过更新的问题确认),McPosition是一个不可变向量,没有公共setter。那样是行不通的。选项:
  • 实现IXmlSerializable(老实说不是很好)
  • McPosition添加公共setter
  • 使用完全可变的单独DTO

2

您需要为可XML序列化的字段添加公共的getter和setter。这里指的是Station、Slot和Subslot。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接