簡體   English   中英

使用protobuf-net,序列化實現接口的派生類型的正確方法是什么?

[英]Using protobuf-net, what is the correct way to serialize a derived type that implements an interface?

我意識到這里有類似的問題,但沒有一個像我所需要的那樣直接問這個問題,可能是因為我缺乏protobuf經驗。 我正在為enyim的緩存客戶端進行代碼轉換,並且無法弄清楚如何創建一個派生類並正確實現接口de / serialize的類。

對於像這樣的樣本

public class BaseClass
{
}

public interface ISomeRules
{
}

public class DerivedClass : BaseClass, ISomeRules
{
}

public class ThirdClass
{
    ISomeRules ruleUser;
}

我想做這樣的事情,因為我通常在任何地方使用屬性

[ProtoContract
,ProtoInclude(101,typeof(DerivedClass))
]
public class BaseClass
{
}

[ProtoContract
,ProtoInclude(102,typeof(DerivedClass))
]
public interface ISomeRules
{
}

[ProtoContract]
public class DerivedClass : BaseClass, ISomeRules
{
}

[ProtoContract]
public class ThirdClass
{
    [ProtoMember(1)]
    ISomeRules ruleUser;
}

但它無法默默緩存。 如果有人建議我從ISomeRules刪除ProtoContract屬性,則反序列化失敗。

這是否可以使用protobuf-net? 這樣做的正確方法是什么? 我應該使用TypeModel(我不掌握,但哪些簡單的測試表明有相同的問題)? 或者TypeModel和屬性的組合?

protobuf-net中的接口支持適用於有限的場景,您基本上是基於接口的模型,特別是嵌套成員。 例如:

[ProtoContract]
public class Foo {
    [ProtoMember(1)]
    public IBar Bar {get;set;}
}

在上面,我們希望能夠序列化Bar ,但我們可能不太了解它。 事實上,如果Foo保證從Bar返回一個非null值,protobuf-net甚至不需要知道任何關於具體類型等的東西 - 它可以繼續填充它給出的對象。

在您的示例中,根對象無疑是BaseClass 我建議ISomeRules是anciliary,並不需要在所有模型中被提及。 但是,如果填充通過ISomeRules公開的成員,則可以嘗試(未經測試):

[ProtoMember(n)]
private ISomeRules Rules { get { return this; } }

然后,它會公開ISomeRules信息,但將其欺騙為子對象。 它至少值得一試; p

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM