2012-08-08 12 views
5

मैं कुछ वर्गों को क्रमबद्ध करने के लिए Protobuf.net का उपयोग कर रहा हूं। मैं बेस क्लास पर [ProtoInclude] निर्दिष्ट किए बिना सुपरहिरो क्लास (नीचे) को क्रमबद्ध करने में सक्षम होना चाहता हूं। ऐसा इसलिए है क्योंकि व्युत्पन्न कक्षाएं स्वचालित रूप से जेनरेट की जाती हैं लेकिन आधार वर्ग नहीं है, इसलिए बेस क्लास सीधे अपने व्युत्पन्न वर्गों के बारे में नहीं जानता है।Protobuf.net: विरासत को संभालने के लिए कैसे करें [ProtoInclude]

[ProtoContract] 
    class Person 
    { 
     [ProtoMember(1)] 
     public int Id { get; set; } 
     [ProtoMember(2)] 
     public string Name { get; set; } 
    } 

    [ProtoContract] 
    class SuperHero : Person 
    { 
     [ProtoMember(3)] 
     public string Powers { get; set; } 
    } 

मैं protobuf.net का नवीनतम संस्करण उपयोग कर रहा हूं।

उत्तर

6

पहले एक नोट: किसी बिंदु पर, आपके कोड को सबक्लास के बारे में पता होना चाहिए - शायद कॉन्फ़िगरेशन के माध्यम से। यह महत्वपूर्ण है कि किसी भी तरह आप प्रत्येक उप प्रकार के लिए विश्वसनीय रूप से संख्याओं को पुन: उत्पन्न करने में सक्षम हैं। काउंटर को बढ़ाने के रूप में आप रनटाइम पर प्रकार ढूंढते हैं, यदि आप डिस्क आदि में डेटा संग्रहीत कर रहे हैं, तो पर्याप्त नहीं है, क्योंकि अगली बार जब आप उसी क्रम में टाइप नहीं कर पाएंगे। इसलिए;

int tag = 7; // why not 
Type subType = typeof(SuperHero); 

फिर, इस उप-प्रकार के बारे में Protobuf शुद्ध बताने के लिए:

RuntimeTypeModel.Default.Add(typeof(Person), true).AddSubType(tag, subType); 

की कि मान कुछ तंत्र के माध्यम से आप एक अद्वितीय सकारात्मक पूर्णांक है कि व्यक्ति का एक उपवर्ग के रूप में सुपर हीरो का प्रतिनिधित्व करता है चलो यह [ProtoInclude(...)]

+1

"कुछ तंत्र" का उपयोग किया गया था जो 'प्रोटोकंट्रैक्ट एट्रिब्यूट' का एक कस्टम संस्करण बनाने के लिए विशेषता प्रसंस्करण कोड के बराबर है ताकि मैं एक व्युत्पन्न वर्ग को '[Pr otoContract (7)] 'जो मूल वर्ग को सजाने के समान ही व्यवहार करेगा' [ProtoInclude (typeof (SuperHero), 7)] '। तथ्य यह है कि विशेषताएं 'मुहरबंद' हैं, हालांकि दुर्भाग्यपूर्ण है। –

+0

बहुत तेज़ प्रतिक्रिया के लिए धन्यवाद! यह मेरे लिए चीजों को अच्छी तरह से साफ़ करता है। –

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