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


101

직렬화 가능한 클래스가 있고 클래스의 속성 중 하나가 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 {}
    }
}

업데이트 :

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


1
두 번째 예제는 올바르게 직렬화합니다 ... 그러나 직렬화를 해제하려고하면 어떻게됩니까?
LightStriker 2011

YAXLib [+ , + ]
Sina Iravanian

3
참고로 XML Serializer는 [Serializable].
John Saunders

@JohnSaunders 나는 그것을 알지 못했습니다.
Konstantin Dinev

답변:


60

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

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


8
DataContractSerializer에는 setter도 필요합니다. 이것은 한 가지 유형의 작업 (예 : 역 직렬화)에만 사용할 수 있지만 선언은 둘 다에 대해 사용해야하지만 직렬화 프로세스는 직렬화를 시도 할 때 값으로 무엇을해야하는지 알지 못하기 때문입니다. XML을 객체로.
ryadavilli

7
@ryadavilli로 표시된 모든 항목 [DataMember]DataContractSerializer읽기 전용 여부를 사용하여 직렬화됩니다 .
James

1
@James 똑같이 시도했을 때 컴파일 시간 오류가 발생했기 때문에 위의 내용을 썼습니다. 이제 코드로 돌아가서 세터를 제거하면 잘 컴파일되는 것 같습니다. 이것은 내가 이것에 대해 더 많이 연구하기 위해 매우 이상하고 아마도 숙제 일 것입니다.
ryadavilli

3
Ahhh는 마침내 내 혼란의 근원을 찾았습니다. 직렬화에는 속성 설정자가 필요하지 않습니다. 그러나 속성에 setter가없는 경우 XML은 개체로 역 직렬화되지 않습니다. 숙제가 끝났습니다.
ryadavilli

1
@ryadavilli 맞아요. XmlSerializer구현 의 제한 일 뿐이며 공개 setter 메서드에 의존합니다. DataContractSerializer그런 의미에서 조금 더 영리합니다 (아마도 반사를 사용하여 장면 뒤에 필드를 설정합니다).
James

10

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


6

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

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

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

속성은 xml 속성으로 직렬화되어야합니다 (원래 게시물 참조). 코드 (DataMember 속성)는 xml 요소를 생성합니다. 내가 아는 한 DataContractSerializer에 속성을 요소가 아닌 특성으로 바꾸도록 지시하는 (깨끗한) 방법은 없습니다. DataContractSerializer는 좋지만 항상이 제한을 염두에 두어야합니다.
sth_Weird

2

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


0

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.