직렬화 가능한 클래스가 있고 클래스의 속성 중 하나가 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 인터페이스 “를 참조하십시오 .
답변
제한 사항 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가 사용되기 때문입니다.