2009-11-17 89 views
8

對象XmlSerialization這是我的目標與保護的屬性setter


    [Serializable()] 
    public class PersistentObject 
    { 
     public virtual int ID { 
      get { return id; } 
      protected set { id = value;} 
     } 
     ... 
    } 

當我嘗試這個序列化到XML,我得到一個錯誤「屬性或索引PersistentObject.ID不能在這種情況下,因爲設定使用訪問者無法訪問「。如果setter不存在,它可以正常工作。我想保留這個ID作爲序列化,而沒有涉及ID上的[XmlIgnore()]的hacktastic解決方案。我寧願如果我可以在setter上添加[XmlIgnore()],但編譯器會抱怨。有人有好的解決方案嗎?

+0

(注意我增加了一個額外的選項伸出你點擊「接受「) – 2009-11-17 20:21:16

回答

20

不幸的是,沒有。 XmlSerializer有一些事情是...刺激。這是其中之一。選項:

  • 使用DataContractSerializer(支持protected等,但提供完整的XML控制)
  • 註釋與[XmlIgnore] - 沒有錯
  • 實施IXmlSerializable - 勤奮,很容易得到錯誤
  • 取下setter,並有一個分開protected方法設置值
  • 使用XmlSerializer構造函數,它允許您在運行時指定所有內容;大量的工作/維護,需要手動緩存串行器(否則它會創建大量的動態組件)
+1

無賴,這就是我希望避免的。謝謝 – Trent 2009-11-17 20:20:03

8

即使它並不直接回答你的問題,請注意您可以用internal二傳手連載性質。要做到這一點,你需要預先生成Sgen.exe XML序列化裝配,並宣佈總成「朋友」用InternalsVisibleTo屬性:

[assembly:InternalsVisibleTo("MyAssembly.XmlSerializers")]