2011-08-23 41 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;} 
} 

如果我嘗試存儲Base類的實例在IsolatedStorage,是沒有得到執行它;它掛起。有沒有辦法做到這一點?

回答

5

那麼,你的屬性是所有的地方 - Base.Child[DataMember],而不是一個[DataContract]。 IIRC在手機7中需要公開類型進行序列化;並且它是基地需要通知兒童。然而; IBase是另一個問題;沒有被指定爲合同。如果可能,請將其更改爲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像IBase一樣,但您需要調查將該標記作爲合同並注意具體類型。如果你無法得到任何答案,我知道protobuf-net支持這種佈局(雖然我還沒有爲手機7測試,特別是,但沒有根本的原因,它不能工作)。

+3

只是爲了確認,是的,你只能在Windows Phone上序列化公共類型。 –