2010-06-29 12 views
2

DataContractSerializer로 불변 인 인스턴스를 직렬화하는 데 문제가 있습니다. 직렬화하는 클래스의 속성에 setter가 없으므로 문제가 있습니다. 문제는 단지 인스턴스를 직렬화하기 (단지 로그에 기록 될 수 있도록) 뿐이므로 결코을 역 직렬화해야합니다. 이 동작을 무시할 수있는 방법이 있습니까?DataContractSerializer를 사용하는 데 문제가 있습니다.

클래스 I 직렬화하기 위해 노력하고있어 :

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

당신은 그래서 당신은 속성의 getter를 할 수 있도록 필드에 [DataMember]을 배치 할 수 있습니다 : 클래스를 직렬화에 사용

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

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

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

코드를 . 이 입력란은 여전히 ​​비공개가 될 수 있습니다. 그러나 그것은 개체를 구성하고 필드를 설정해야하므로 readonly이 될 수 없습니다. 이 버전은 ISerializable 것 대신에 [DataContract]의 특성을 사용 [DataMember(Name = "Name1")]

+0

고맙습니다. 나는이 질문을 게시하기 전에 이것을 생각해야했다. :) – Patrik

+0

이것이 변경되었지만 .net 4.5.1에서는 읽기 전용 필드를 직렬화 및 비 직렬화 할 수 있는지 여부를 모릅니다. – serine

3

을 사용하지 않는

[편집] 이 필드 이름을 사용하게됩니다. 이것이 조작성에 어떤 영향을 미치는지는 모르겠지만 공용 설정자를 필요로하지는 않습니다.

[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); 
    } 
} 
관련 문제