2010-06-23 7 views
5

मैंने protobuf-net में विरासत सुविधा के बारे में कई प्रश्न पढ़े हैं। मुझे आश्चर्य है कि यदि मैं [ProtoContract], [ProtoMember] का उपयोग करने के समान तरीके से [DataContract], [DataMember] का उपयोग कर सकता हूं। मैं [ProtoInclude] का उपयोग करने के बजाय [KnowType] का उपयोग क्यों नहीं कर सका?मुझे [ProtoInclude] का उपयोग क्यों करना है?

मैं इस सवाल का मैं क्योंकि [DataContract] का इस्तेमाल किया [DataMember] Protobuf शुद्ध के क्रमांकन के लिए पहले से ही बढ़ा,। "प्रोटोबफ-नेट" जोड़ने की कोई आवश्यकता नहीं थी। यह केवल "सिस्टम। रनटाइम। क्रमबद्धता" का उपयोग करता था।

लेकिन ... अब अगर मेरी कक्षा की जरूरत कुछ वर्ग से प्राप्त करना, मैं जोड़ने के लिए "Protobuf-तंत्र" के लिए [ProtoInclude] विशेषता क्या है? उदाहरण के लिए,

using System.Runtime.Serialization; 
namespace test 
{ 

[DataContract] 
/// [KnowType(typeof(SomeClass))] 
/// or 
/// [ProtoInclude(100,typeof(SomeClass))] 
public class BaseClass 
{ 
    //... 
    [DataMember(Order=1)] 
    public string BlahBlahBlah {get; set;} 
} 

[DataContract] 
public class ChildClass1 : BaseClass 
{ 
    //... 
    [DataMember(Order=1)] 
    public string BlahBlahBlah {get; set;} 
} 
}// end namespace 

अंत में, मुझे आश्चर्य है कि अगर मैं 100 बच्चे वर्ग है, विल नहीं मैं अपने आप को पागल आधार वर्ग के अंदर 100 [ProtoInclude] टैग जोड़ने? किसी भी मदद

वी के लिए adv में

Thx

+0

ध्यान दें कि यह अब v2 –

+0

@Marc में सत्य नहीं है; अद्यतन के लिए Thx। मैं फिर v2 पर कोशिश करेंगे। – tong

उत्तर

4

संपादित करें: अब यह वी 2 में आवश्यक है - आप कार्यावधि में यह निर्दिष्ट कर सकते हैं, या DynamicType का उपयोग करें।


इस का कारण यह है कि Protobuf तार प्रारूप (गूगल द्वारा तैयार) किसी भी प्रकार के मेटाडाटा को शामिल नहीं करता है, और इसलिए हम जरूरत है जानते हुए भी वस्तु की किस प्रकार के बारे में हम बात कर रहे हैं में से कुछ रास्ता। [KnownType] यह जानकारी प्रदान नहीं करता है, और स्वतंत्र रूप से एक मजबूत कुंजी प्रदान करने का कोई स्पष्ट तरीका नहीं है।

दरअसल, प्रोटोबफ विरासत या तो का समर्थन नहीं करता है - उप-प्रकारों को नेस्टेड संदेशों के रूप में उप-प्रकार के इलाज के द्वारा प्रोटोबफ-नेट शिम। तो एक ChildClass1 वास्तव में पारगमन में मानो BlahBlahBlah एक उप-वस्तु की एक संपत्ति है, था प्रकट होता है एक सा की तरह:

message BaseClass { 
    optional ChildClass1 ChildClass1 = 1; 
    optional SomeOtherSubType SomeOtherSubType = 2; 
} 
message ChildClass1 { 
    optional string BlahBlahBlah = 1; 
} 

आदि

यह छोड़ते हुए पुन; "v2" में, आपके पास अपने कोड के माध्यम से टाइप मॉडल के बाहर इस डेटा को निर्दिष्ट करने का विकल्प होता है। इसका मतलब है कि आपको सब कुछ सजाने की जरूरत नहीं है, लेकिन इसे अभी भी प्रकारों के साथ कुंजी को जोड़ने के लिए कुछ तंत्र की आवश्यकता है।

+0

कम SO, अधिक प्रोटोबफ-नेट विकास! V2 के लिए इंतजार नहीं कर सकता। – GenericTypeTea

+0

आपकी जानकारी के लिए बहुत बहुत धन्यवाद। मुझे अभी भी आश्चर्य है कि अगर मेरे पास 27 बाल वर्ग केवल 1 बेस क्लास लागू किए गए हैं, तो मुझे बेस क्लास के अंदर 27 [ProtoInclude] टैग जोड़ना होगा। क्या यह सही है? – tong

+0

@vee - वर्तमान डाउनलोड करने योग्य संस्करण में, हां। "V2" में, नहीं: लेकिन * कहीं * आपको प्रत्येक उप-प्रकार को एक संख्या देने की आवश्यकता है। लेकिन यह गुणों के माध्यम से होना जरूरी नहीं है। –

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