[英]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.