2012-03-29 5 views
5
[DataContract] public class Foo 
{ 
    [DataMember(Order = 1)] public int FooId { get; set; } 
} 

[DataContract] public class Bar : Foo 
{ 
    [DataMember(Order = 2)] public string Name { get; set; } 
} 

[DataContract] public class Baz : Bar 
{ 
    [DataMember(Order = 3)] public string BazName { get; set; } 
} 

फिर, कोड मैं सेटअप में एक नया TypeModel और मेरे उपप्रकारमेरी सूची <Foo> प्रोटोबफ-नेट के साथ क्रमबद्ध क्यों नहीं होगी?

_ProtobufSerializer = TypeModel.Create(); 
_ProtobufSerializer.Add(typeof(Bar), true); 
_ProtobufSerializer.Add(typeof(Baz), true); 
var type = _ProtobufSerializer.Add(typeof(Foo), true); 
type.AddSubType(100, typeof(Bar)); 
type.AddSubType(101, typeof(Baz)); 

अब जोड़ने के लिए, मैं फू, बार और बाज ठीक की घटनाओं को क्रमानुसार कर सकते हैं। अगर मैं

var listThatWorks = new List<Foo> { new Foo { FooId = 12 } } 
var anotherListThatWorks = new List<Foo> { new Bar { FooId = 12, Name = "Test" } } 

क्रमबद्ध करता है तो यह ठीक काम करता है। हालांकि, अगर मैं क्रमानुसार

var fails = new List<Foo> { new Baz { FooId = 12, Name = "Test" } } 

तब मैं संदेश "अप्रत्याशित उप-प्रकार: बाज" के साथ एक InvalidOperationException मिलता है। मैं क्या गलत कर रहा हूं? क्या प्रोटोबफ-नेट के साथ उप-प्रकारों का उपयोग करना एक बुरा विचार है?

इसके अलावा, मुझे पता लगाने में मदद के लिए @ बीएफरी के लिए धन्यवाद, यह सबक्लास के दो स्तर होने से संबंधित है।

+0

संबंधित प्रश्न: [protobuf.net अप्रत्याशित उप प्रकार] (http://stackoverflow.com/questions/3797651/protobuf-net-unexpected-subtype) –

+0

@ एम। बाबाकॉक - मैंने देखा। मेरा मानना ​​है कि शीर्ष प्रतिक्रिया प्रोटोबफ-नेट के पुराने संस्करण का जिक्र कर रही थी (गलत हो सकती है)। वह, और प्रस्तावित उत्तर काम नहीं किया। – AgileJon

+2

मैंने बस एक सरल कंसोल ऐप में अपना कोड आजमाया: http://pastie.org/3692350 और यह मेरे लिए काम करता है, कोई अपवाद नहीं .... – BFree

उत्तर

4

समझ गया। वास्तव में, मुझे बीएफआर को क्रेडिट देना चाहिए। उन्होंने एक रननेबल नमूना ऐप रखा जो मुझे दिखाता है कि मेरी मूल पोस्ट बहुत सरल थी। वास्तविक समस्या मेरा ऑब्जेक्ट मॉडल था जहां बाज़ बार का उप-वर्ग था जो स्वयं फू का उप-वर्ग था। जब मैं TypeModel सेटअप करता हूं तो मैंने इस संरचना को सही ढंग से निर्दिष्ट नहीं किया था। होना चाहिए:

_ProtobufSerializer = TypeModel.Create(); 
_ProtobufSerializer.Add(typeof(Baz), true); 
var barType = _ProtobufSerializer.Add(typeof(Bar), true); 
var fooType = _ProtobufSerializer.Add(typeof(Foo), true); 
fooType.AddSubType(100, typeof(Bar)); 
barType .AddSubType(101, typeof(Baz)); 

मैं वास्तव में आदेश मानों के बारे में निश्चित नहीं हूं, लेकिन मुझे उन कार्यों को पता है।

+0

बस इसे देखने के लिए वापस आया - खुशी है कि आप इसे हल किया गया। –

संबंधित मुद्दे