programing

setter가없는 속성이 직렬화되지 않는 이유

nasanasas 2020. 9. 10. 07:58
반응형

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 인터페이스 "를 참조하십시오 .


Limitation of XMLSerializer - Properties without setter can't be serialized.

But you can use DataContractSerializer to serialize private setter properties -

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

if you want to have private setters, and have the object be serializable/deserializable, impliment ISerializable, and create a constructor like MyObject(SerializationInfo info, StreamingContext context). An example is found here.


Serialization attributes are used to serialize and deserialize objects. XmlSerializer will assume that you don't need to serialize any property that doesn't have a setter. Setter will be used when deserializing a string into an object, because an instance of the object needs to be created and then the setter will be used to populate the property value.

참고URL : https://stackoverflow.com/questions/13401192/why-are-properties-without-a-setter-not-serialized

반응형