[c#] setter가없는 속성이 직렬화되지 않는 이유

직렬화 가능한 클래스가 있고 클래스의 속성 중 하나가 Guidgetter에서를 생성합니다 . 이 속성은 setter를 구현하지 않으며 serialization 중에 무시됩니다. 그 이유는 무엇이며 내 속성을 직렬화하려면 항상 setter를 구현해야합니다.

[Serializable]
public class Example
{
    [XmlAttribute("id")]
    public string Id
    {
        get
        {
             return Guid.NewGuid().ToString();
        }
    }
}

빈 setter를 구현하려고 시도했는데 올바르게 직렬화되었습니다.

[Serializable]
public class Example
{
    [XmlAttribute("id")]
    public string Id
    {
        get
        {
             return Guid.NewGuid().ToString();
        }
        set {}
    }
}

업데이트 :

값이 변경되지 않거나 값이 내부적으로 생성되는 속성을 어떻게 정의해야합니까?



답변

XmlSerializer읽기 전용 속성을 직렬화하지 않는다는 제한 사항입니다. 두 번째 예제에서 수행 한 작업은 기본적으로 직렬화하도록하는 해킹이지만 나중에 역 직렬화해야하는 경우 쓸모가 없습니다.

또는 DataContractSerializer 사용으로 전환 할 수 있습니다 . 더 유연합니다.


답변

MSDN 설명서의 ” Introducing XML Serialization “을 참조하십시오 . 무엇보다도 다음과 같이 말합니다.

직렬화 할 수있는 항목

XmlSerializer 클래스를 사용하여 다음 항목을 직렬화 할 수 있습니다.

Public read/write properties and fields of public classes.

Classes that implement ICollection or IEnumerable.

노트 :

Only collections are serialized, not public properties.
XmlElement objects.

XmlNode objects.

DataSet objects.

또한, “를 참조 왜 XML 직렬화 클래스는 매개 변수가없는 생성자가 필요


또한 IXmlSerializable

XML Serializer로 직렬화 할 수있는 위의 유형 외에도 IXmlSerializable 인터페이스를 구현하는 모든 유형을 직렬화 및 역 직렬화 할 수 있습니다. 특히 이것은 XElement 및 XDocument 유형을 직렬화 할 수 있음을 의미합니다.

IXmlSerializable 인터페이스 “를 참조하십시오 .


답변

제한 사항 XMLSerializer-setter가없는 속성은 직렬화 할 수 없습니다.

하지만 당신은 사용할 수 있습니다 DataContractSerializer직렬화 private setter properties

[DataMember]
public string Id
{
    get
    {
         return Guid.NewGuid().ToString();
    }
    private set {}
}


답변

개인 setter를 원하고 개체를 직렬화 / 해제 가능하고 ISerializable을 구현하고 MyObject (SerializationInfo info, StreamingContext context)와 같은 생성자를 만듭니다. 예는 여기에서 발견된다 .


답변

직렬화 특성은 개체를 직렬화 및 역 직렬화하는 데 사용됩니다. XmlSerializer는 setter가없는 속성을 직렬화 할 필요가 없다고 가정합니다. Setter는 문자열을 개체로 역 직렬화 할 때 사용됩니다. 개체의 인스턴스를 만들어야하고 속성 값을 채우는 데 setter가 사용되기 때문입니다.


답변