2013-06-19 5 views
14

मेरे पास डेटाकंट्रैक्ट्स के साथ एक असेंबली है और मुझे जावा सिस्टम के साथ डेटा का आदान-प्रदान करने में सक्षम होने के लिए .proto स्कीमा उत्पन्न करने की आवश्यकता है। डेटाकंट्रैक्ट कोड को बदला जा सकता है लेकिन मैं इसमें [ProtoContract] और [ProtoMember] विशेषता नहीं जोड़ सकता क्योंकि इसका परिणाम प्रोटोबफ-नेट असेंबली निर्भरता में होगा। हम सिस्टम के सी # भागों में डब्ल्यूसीएफ का उपयोग करते हैं, इसलिए हम अधिकांश सी # परियोजनाओं में प्रोटो-बफ असेंबली पर निर्भरता नहीं लेना चाहते हैं जो जावा सिस्टम के साथ काम नहीं करते हैं।गुणों के बिना प्रोटोबफ-नेट क्रमबद्धता

Protobuf शुद्ध साइट पर एक GettingStarted खंड में यह कहा जाता है कि:

गुण पसंद नहीं है?
v2 में, विशेषता के साथ किए जा सकने वाले सभी चीजों को रनटाइम पर RuntimeTypeModel के माध्यम से भी कॉन्फ़िगर किया जा सकता है।

हालांकि मुझे कोई संकेत नहीं है कि वास्तव में गुणों के बिना क्रमबद्धता को कैसे कॉन्फ़िगर किया जाए और मैंने इसका कोई उदाहरण नहीं देखा है। इस जवाब से ज्यादातर पूर्व-संपादन सवाल है, जहां false था से संबंधित है:

मैं

[DataContract] 
public class MyEntity 
{ 
    [DataMember(Order = 1)] 
    public String PropertyA { get; set; } 

    [DataMember(Order = 2)] 
    public int PropertyB { get; set; } 
} 

RuntimeTypeModel.Default.Add(typeof(MyEntity), false); 

string proto = Serializer.GetProto<MyEntity>(); 

करने के लिए और proto

package ProtobufTest; 

message MyEntity { 
} 

उत्तर

12

स्पष्टीकरण के मूल्य के रूप में निम्नलिखित मिल कोशिश कर रहा हूँ RuntimeTypeModel.Add(...)


मैंने आपके एक्साक का उपयोग किया है टी कोड (मैं अनुमान लगाया है कि इस namespace ProtobufTest में था, लेकिन बाकी सवाल से कॉपी/पेस्ट था) r2.0.0.640 (वर्तमान NuGet तैनाती) के साथ, और मैं मिलता है:

package ProtobufTest; 

message MyEntity { 
    optional string PropertyA = 1; 
    optional int32 PropertyB = 2 [default = 0]; 
} 

इसके अलावा, आप प्राप्त सटीक समान परिणाम भी यदि आप RuntimeTypeModel.Default.Add(...) लाइन को हटाते हैं।

यह मेरे लिए स्पष्ट नहीं है कि आप कुछ अलग क्यों देख रहे हैं है - आप स्पष्ट कर सकते हैं:

  • जो Protobuf शुद्ध संस्करण आप उपयोग कर रहे हैं वास्तव में
  • अगर उन [DataContract]/[DataMember] विशेषताओं System.Runtime.Serialization.dll होते हैं , या अपना खुद का (माफ करना अगर यह एक विचित्र सवाल लगता है)

पूरी तरह से प्रश्न का उत्तर देने के लिए: यदि आपके पास कोई विशेषता नहीं हो सकती है (ए nd को आपने अभी ठीक हैं हैं) तो आप भी कर सकता है:

RuntimeTypeModel.Default.Add(typeof(MyEntity), false) 
    .Add(1, "PropertyA") 
    .Add(2, "PropertyB"); 

जो PropertyA कुंजी 1 के रूप में कॉन्फ़िगर होता है, और PropertyB कुंजी के रूप में 2.

+0

त्वरित प्रतिक्रिया के लिए धन्यवाद! मैं एक ही संस्करण का उपयोग करता हूं। मेरे 'RuntimeTypeModel.Default.Add (typeof (MyEntity), ...) में दूसरा पैरामीटर वास्तव में' झूठा 'था। 'सत्य' के साथ या उस कॉल के बिना मुझे वही परिणाम मिलता है जैसा आप करते हैं। – Mike

+0

@ माइक आह, दाएं; हां, कि 'झूठा' का अर्थ है "गुणों को न देखें", जिसमें 'डेटामेम्बर (ऑर्डर = एन)' विशेषताओं को नहीं देखा गया है।यदि आप 'झूठी' पास करते हैं, तो आपको इसे मैन्युअल रूप से कॉन्फ़िगर करने की आवश्यकता है * - जो मैंने उपरोक्त अंतिम उदाहरण में किया है। यदि आप 'डेटामेम्बर (ऑर्डर = एन)' विशेषताओं का उपयोग करना चाहते हैं: 'सत्य' –

+0

कहें, वैसे, यह अच्छा होगा।' (1, "PropertyA") 'भाग दूसरे के रूप में अभिव्यक्ति स्वीकार करने के लिए मजबूत-टाइपिंग और कंपाइलर जांच के लिए पैरामीटर :) यह गैर-जिम्मेदार प्रकारों के साथ काम करना आसान कर देगा। – Mike

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