2013-03-28 58 views
-1

我有一個datacontract象下面這樣:避免XML序列化時序列化私有數據成員

[DataContract] 
class Person 
{ 
    private string m_name; 
    [DataMember] 
    public string Name 
    { get {return m_name;} 
     set {m_name = value;} 
    } 
} 

當XML序列化序列化這個對象,它生成具有私有成員XML像

<person><m_name>john</m_name></person> 

如何強制序列化程序只序列化公共屬性。

在此先感謝。

+0

可能重複[C#DataContract屬性爲私有字段?](http://stackoverflow.com/questions/8883615/c-sharp-datacontract-attribute-for-private-fields) – Romoku 2013-03-28 02:25:25

+0

DataContrac使用的DataContractSerializer,不XmlSerializer的,除非否則你已經告訴過它。它們是有區別的。 – Tim 2013-03-28 05:59:28

+0

由於'XmlSerializer'和'DataContractSerializer'都給出了預期的答案,是否有可能用'[DataMember]'屬性而不是'Name'裝飾了'm_name'?由於名稱沒有出現在您發佈的XML中,但m_name的確是...... – Tim 2013-03-28 06:39:55

回答

2

奇怪的是,您的私人成員寫入XML。我試圖模仿你的情況和串行只寫了公共領域:

 
    [DataContract] 
    public class Person 
    { 
     private string m_name; 
     [DataMember] 
     public string Name 
     { 
      get { return m_name; } 
      set { m_name = value; } 
     } 
    }

private void Form1_Load(object sender, EventArgs e) { var person = new Person() {Name = "john"}; var xs = new XmlSerializer(typeof(Person)); var sw = new StreamWriter(@"c:\person.xml"); xs.Serialize(sw, person); }

您還可以閱讀:http://msdn.microsoft.com/en-us/library/83y7df3e%28VS.71%29.aspx

+0

恕我直言,我不相信這個答案根據他發佈的代碼來解決OP的問題。他使用'[DataContract]'而不是'[Serializable]',因此將使用DataContractSerializer,其行爲與XmlSerializer不同。 – Tim 2013-03-28 07:45:27

1

我做了類似Andark的答案的東西,除了我用DataContractSerializer代替XmlSerializer。這是在VS 2012中針對.NET 4.5完成的。

下面是測試代碼:

using Sytem; 
using System.IO; 
using System.Runtime.Serialization; 

namespace ConsoleApplication1 
{ 

    class Program 
    { 

     static void Main(string[] args) 
     { 

      Person myPerson = new Person() { Name = "Tim" }; 

      using (FileStream writer = new FileStream("Person.xml", FileMode.Create, FileAccess.Write)) 
      { 

       DataContractSerializer dcs = new DataContractSerializer(typeof(Person)); 
       dcs.WriteObject(writer, myPerson); 
      } 
     } 
    } 

    [DataContract] 
    class Person 
    { 

     private string m_name; 

     public string Name 
     { 
      get 
      { 
       return m_name; 
      } 
      set 
      { 
       m_name = value; 
      } 
     } 
    } 
} 

當我運行它,我得到以下XML:

<Person xmlns="http://schemas.datacontract.org/2004/07/ConsoleApplication1" 
     xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
    <Name>Tim</Name> 
<Person> 

這是什麼預期。

需要注意的是爲DataContract的默認的序列是DataContractSerializer是很重要的,XmlSerializer,並有一定的差異。只有被標記爲[DataMember]的會員應該被序列化,並且訪問級別(私人,公共等)是不相關的 - 如果您使用[DataMember]標記私人字段或成員,它將被序列化。