DataContractSerializer는 OpenAccess 버전 값을 건너뜁니다.
-
21-08-2019 - |
문제
OpenAccess 연결 해제 모델을 사용하고 있습니다.DataConractSerializer를 사용하여 개체를 역직렬화하려고 하면 이 개체의 Version 속성은 0이지만 XML에서만 가능합니다.코드를 디버깅하고 값을 보면 1(또는 2,3...)입니다.
직렬화 "int temp = object.Version" 전에 말하면 직렬화자는 값을 저장할 수 있습니다.
게으른 문제가 있다고 확신합니다.명시적인 호출 없이 이 값을 강제로 읽거나 저장하려면 어떻게 해야 합니까?
해결책
객체의 .retrieve () 메소드를 호출하여 모든 게으른로드 된 필드를로드하고 직렬화에 필요한 모든 데이터가 있어야합니다. 도움이되기를 바랍니다.
다른 팁
그것은 다음과 같은 소리가 난다 [DataMember]
필드에 대해 설정되거나 필드를 기본값으로 설정하고 게으른 동작을 우회합니다.유형을 제어하는 경우 아마도 [OnSerializing]
직렬화가 시작되기 전에 이 속성을 엿보는 메서드입니다.그렇게 하면 값이 있어야 하며 다른 곳에 코드를 넣을 필요가 없습니다.
유형이 생성되면 유형인지 확인하십시오. partial class
.그렇다면 다른 것을 추가할 수 있습니다. partial class
동일한 이름(및 동일한 네임스페이스)을 갖고 [OnSerializing]
거기 방법이...
예(작동하려면 마지막 블록의 주석 처리를 제거하세요):
using System;
using System.Runtime.Serialization;
using System.Xml;
class Program {
static void Main() {
using (XmlWriter writer = XmlWriter.Create(Console.Out)) {
new DataContractSerializer(typeof(Foo))
.WriteObject(writer, new Foo());
}
}
}
[DataContract]
partial class Foo {
[DataMember(Name="Bar")]
private int? bar;
public int Bar {
get {
if (bar == null) bar = 27; // somthing lazy
return bar.GetValueOrDefault();
}
set { bar = value; }
}
}
/* UNCOMMENT THIS
partial class Foo {
[OnSerializing]
private void BeforeSerialize(StreamingContext ctx) {
int tmp = Bar;
}
}
*/
제휴하지 않습니다 StackOverflow