2010-06-29 84 views
2

我無法用DataContractSerializer的序列化不可改變的情況下遇到問題,因爲在類中的屬性,我序列化是缺少setter方法。問題是,我只是想序列化實例(只所以可以寫入日誌),我會永遠需要向反序列化。有沒有辦法繞過這種行爲?使用的DataContractSerializer

類我試圖序列:

public string Serialize() 
{ 
    var serializer = new DataContractSerializer(typeof(Person)); 
    StringBuilder stringBuilder = new StringBuilder(); 
    using (XmlWriter writer = XmlWriter.Create(stringBuilder)) { 
     serializer.WriteObject(writer, this); 
    } 
    return stringBuilder.ToString(); 
} 

回答

3

可以放置在領域[DataMember]從而使你擁有財產性干將:

[DataContract] 
public class Person 
{ 
    private readonly string _name; 

    [DataMember] 
    public string Name 
    { 
     get { return _name; } 
    } 

    public Person(string name) 
    { 
     _name = name; 
    } 
} 

用於序列化類的代碼。這些字段仍然可以是私人的。然而,它不能readonly因爲它需要來構造對象然後設置的字段。

[編輯] 這將導致使用的字段名,除非你使用[DataMember(Name = "Name1")]

+0

非常感謝你。在發佈問題之前,我應該想到這一點。 :) – Patrik 2010-06-29 07:32:59

+0

不知道這個改變,但在.NET 4.5.1可以序列和反序列化只讀字段 – serine 2013-09-22 01:43:54

3

這個版本使用ISerializable的屬性而不是[DataContract]。 我不知道這將如何影響可操作性,但並不需要一個公共的制定者。

[Serializable] 
public class Person : ISerializable 
{ 
    private readonly string _name; 

    public string Name 
    { 
     get { return _name; } 
    } 

    public Person(string name) 
    { 
     _name = name; 
    } 

    public string Serialize() 
    { 
     DataContractSerializer serializer = new DataContractSerializer(typeof(Person)); 
     System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); 
     using (System.Xml.XmlWriter writer = System.Xml.XmlWriter.Create(stringBuilder)) 
     { 
      serializer.WriteObject(writer, this); 
     } 
     return stringBuilder.ToString(); 
    } 

    public void GetObjectData(SerializationInfo info, StreamingContext context) 
    { 
     info.AddValue("Name", _name); 
    } 
} 
相關問題