2011-09-19 51 views
3

我想通過下面的代碼XmlSerializer的序列化不能自定義類型

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

等....

感謝。

+0

「McPosition」是什麼樣的? –

+0

您能向我們展示您對'McPosition'類型的定義嗎? –

+0

@Marc Gravell,看我的編輯 –

回答

5

要通過XmlSerializer是可序列化,在一個類型必須每個屬性具有公共getter和setter(而不是被標記爲[XmlIgnore],也不產生ShouldSerialize*()返回假,等)。公共字段也是序列化的(只要它們不是readonly),但暴露字段更不理想。 XmlSerializer從不看私人會員。

猜測(編輯:現在更新的問題確認)即McPosition是不可變的載體,沒有公衆的制定者。這是行不通的。選項:

  • 實現IXmlSerializable(不是太漂亮,說實話)
  • 公共setter方法添加到McPosition
  • 使用單獨的DTO是完全可變
2

您必須添加公共getter和用於XML序列化字段的setter。在這裏:站,插槽和子插槽。

相關問題