2011-08-23 2 views
3

나는 직렬화에 의심이갑니다.C#의 직렬화

예 :

interface IBase {} 

[DataContract] 
class Base : IBase 
{ 
    [DataContract] 
    public Derived Child{get;set;} 
} 

[DataContract] 
[KnownType(typeof(Base))] 
class Derived : Base 
{ 
    [DataMember] 
    public IBase Parrent {get;set;} 
} 

내가 IsolatedStorage에, 그것을 실행하기되지 Base 클래스의 인스턴스를 저장하려고하면, 그것은 달려있다. 이 일을 할 수있는 방법이 있습니까?

답변

5

글쎄, 당신의 속성은 모든 장소 이상 있습니다 - Base.Child 것은 [DataMember] 아닌 [DataContract]입니다. 전화 번호 7의 IIRC에는 직렬화를위한 공용 유형이 필요합니다. 어린이는 어린이에게의 알림이 필요합니다. 하나; IBase은 또 다른 문제점입니다. 그것은 계약으로 지정되지 않습니다. 가능한 경우 serializer가 모든 구체적인 계약에 대해 알아야하므로 Base (IBase 아님)으로 변경하십시오.

그래서 :

public interface IBase {} 

[DataContract] 
[KnownType(typeof(Derived))] 
public class Base : IBase 
{ 
    [DataMember] 
    public Derived Child{get;set;} 
} 

[DataContract] 
public class Derived : Base 
{ 
    [DataMember] 
    public Base Parent {get;set;} 
} 

또한, Parent 회원은 나무 시리얼에 대한 큰 문제가 (당신이 명시 적으로 전체 그래프 모드를 사용하지 않는 DataContractSerializer는 트리 시리얼입니다).

과 같이 DCS를받을 수는 있지만 구체적인 형식을 명시하고 계약으로 표시해야합니다. 어디서나 얻을 수 없다면, protobuf-net이 그 레이아웃을 지원한다는 것을 안다. (비록 내가 을 특별히 전화했는데을 테스트하지는 않았지만 작동하지 않는 근본적인 이유는 없다).

+3

확인하려면 예, Windows Phone에서 공개 형식 만 serialize 할 수 있습니다. –