setter가없는 속성이 직렬화되지 않는 이유
직렬화 가능한 클래스가 있고 클래스의 속성 중 하나가 Guid
getter에서를 생성합니다 . 이 속성은 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
'programing' 카테고리의 다른 글
Boost.Log 로깅 라이브러리 사용 경험이 있으십니까? (0) | 2020.09.10 |
---|---|
`= default` 이동 생성자는 멤버 단위 이동 생성자와 동일합니까? (0) | 2020.09.10 |
Java 프로젝트에서 패키지 이름 지정에 어떤 전략을 사용하며 그 이유는 무엇입니까? (0) | 2020.09.10 |
매개 변수와 함께 함수에 대한 참조를 어떻게 전달할 수 있습니까? (0) | 2020.09.10 |
MySQL의 ORDER BY RAND () 함수를 어떻게 최적화 할 수 있습니까? (0) | 2020.09.10 |