2009-09-30 56 views
4

有沒有辦法讓XmlSerializer默認忽略所有成員,除非我另有說明?.NET XmlIgnore默認?

我有一個基類和幾個派生類有很多的成員,但大多數我不想被序列化。只有少數人可以接受序列化。

+1

不,沒有辦法做到這一點。爲什麼使用XML序列化?你使用的是什麼版本的.NET? – 2009-09-30 01:29:45

+0

.NET 3.5。我使用XML文件來描述遊戲中的過場動畫。我希望將這些XML文件反序列化爲相應的類/對象,以便遊戲引擎可以運行這個過場動畫。在場景編輯器中還將重新序列化。如果有比XML更好的方法,我願意提供建議。 XML + XMLSerializer可以輕鬆修改和調試過場動畫,但也易於在C#代碼中實現和使用。 – morrog 2009-09-30 04:31:14

回答

4

不,你不能這樣做。

XmlSerializer正在使用「退出」進程 - 它會將所有內容(所有公共屬性)序列化,除非您使用[XmlIgnore]屬性明確選擇禁用。沒有辦法改變這種行爲。

另一方面,.NET 3.5 DataContractSerializer採取另一種方法 - 選擇加入。除非你明確告訴它,否則它不會序列化任何東西,通過用[DataMember]裝飾你的成員。

所以也許DataContract序列化程序會爲你工作?它還有一些優點(不需要無參數的構造函數,也可以序列化內部和私有屬性,並且它還可以序列化字段而不是屬性,如果需要的話),並且可以根據速度進行調整。還有一些缺點 - 它不支持XML節點中的屬性 - 所以您必須根據您的要求進行選擇。

有一個很好的比較Dan Rigsby - 檢查出來!

Marc

+0

製造或破壞因素可能是DataContractSerializer不支持XmlAttributeAttribute。 – 2011-01-19 21:23:39

1

您可以執行IXMLSerializable並確定您想要序列化的內容。 Here是對象序列化的一個例子。查看this SO發佈關於實現IXMLSerializable的正確方法。 Here是IXMLSerializable用於某些集合的示例。

這將是這個樣子:

using System; 
using System.Xml; 
using System.Xml.Schema; 
using System.Xml.Serialization; 

namespace ConsoleApplicationCSharp 
{ 
    public class ObjectToSerialize : IXmlSerializable 
    { 
    public string Value1; 
    public string Value2; 
    public string Value3; 
    public string ValueToSerialize; 
    public string Value4; 
    public string Value5; 

    public ObjectToSerialize() { } 

    public void WriteXml(System.Xml.XmlWriter writer) 
    { 
     writer.WriteElementString("Val", ValueToSerialize); 
    } 

    public void ReadXml(System.Xml.XmlReader reader) 
    { 
     if (reader.MoveToContent() == XmlNodeType.Element && reader.LocalName == "Event") 
     { 
      ValueToSerialize = reader["Val"]; 
      reader.Read(); 
     }   
    } 
    public XmlSchema GetSchema() { return (null); } 
    public static void Main(string[] args) 
    { 
     ObjectToSerialize t = new ObjectToSerialize(); 
     t. ValueToSerialize= "Hello"; 
     System.Xml.Serialization.XmlSerializer x = new XmlSerializer(typeof(ObjectToSerialize)); 
     x.Serialize(Console.Out, t); 
     return; 
    } 
    } 
} 
+0

I thnk writer.WriteFullEndElement();在您的代碼中不需要,因爲您已經使用WriteElementString而不是WriteStartElement。 – Anax 2009-09-30 05:46:22

+0

謝謝,我更新了它。我想我也應該注意到我有點懶,這個類wouldnt xml序列化到任何東西,因爲我沒有任何屬性。讓我們假設我的成員變量是屬性:) – SwDevMan81 2009-09-30 11:32:28