2011-09-30 6 views
14

मैंने कहीं ProtoBuf.NET के लेखक है कि द्वारा एक टिप्पणी पढ़ा है बिना ProtoBuf.NET साथ Serializing:टैगिंग सदस्यों

विकल्प स्वचालित रूप से संख्या का अनुमान लगाने के होते हैं, लेकिन है कि भंगुर और नहीं की सिफारिश की है। केवल तभी इसका उपयोग करें यदि आपको पता है कि आपको कभी भी अधिक सदस्यों को जोड़ने की आवश्यकता नहीं है (यह उन्हें वर्णानुक्रम से आदेश देता है, इसलिए एक नया आर्डवर्काउंट जोड़ना सब कुछ तोड़ देगा)।

यही स्थिति का उस तरह मैं में :)

रुचि मैं कुछ है कि एक नक्शे-को कम परिदृश्य में जहाँ मैं प्रोटोकॉल बफ़र्स का उपयोग कर दूरस्थ मशीन पर, जिसके परिणामों को क्रमानुसार करना चाहते हैं के लिए समान है है कर रहा हूँ है (उदाहरण के लिए मानचित्र के "नक्शा" पक्ष को कम करें) और बाद में उन्हें पढ़ें और आगे के प्रसंस्करण के लिए उन परिणामों को गठबंधन करें (उदाहरण के लिए "कम करें" पक्ष)।

मैं प्रत्येक संभावित वर्ग पर एक विशेषता सजावट मैराथन शुरू नहीं करना चाहता हूं जो कि इस प्रक्रिया के दौरान क्रमबद्ध हो सकता है, और मुझे प्रोटोकॉल बफर बहुत आकर्षक लगते हैं क्योंकि मैं मोनो के साथ परिणाम बना सकता हूं और उनका उपभोग कर सकता हूं आसानी से एमएस.नेट पर और इसके विपरीत ...

सदस्यों को प्री-टैगिंग के स्पष्ट डाउनसाइड्स मुझे परेशान नहीं करते हैं क्योंकि बिल्कुल वही सॉफ़्टवेयर संशोधन पीढ़ी/खपत करता है, इसलिए मुझे चिंता करने की आवश्यकता नहीं है नए सदस्यों को संक्षेप में कोड में पॉपिंग और तो मेरी पूरी योजना ...

खिलवाड़ के बारे में, मेरे सवाल यह है:

  • मैं इसे कैसे कर सकता हूं (मेटा कक्षाओं को टैगिंग/बिल्डिंग के बिना ProtoBuf.NET के साथ Serialize)?
  • क्या मेरी योजना में कोई छेद है जिसे मैंने चमकदार रूप से याद किया है?
+0

क्या आपको उन परिणामों को किसी भी समय स्टोर करना होगा, या डेटा हमेशा लाइव रहता है? और आप कितने निश्चित हो सकते हैं कि दोनों सिरों सिंक हो जाएंगे? इसके अलावा, ऐसा लगता है कि इसे ठीक काम करना चाहिए ... –

उत्तर

8

आप एक एकल विशेषता के साथ रह सकते हैं, तो चाल है:

[ProtoContract(ImplicitFields = ImplicitFields.AllPublic)] 
    public class WithImplicitFields 
    { 
     public int X { get; set; } 
     public string Y { get; set; } 
    } 

यहाँ 2 विकल्प हैं; AllPublicXmlSerializer जैसे काम करता है - सार्वजनिक गुण और फ़ील्ड क्रमबद्ध होते हैं (टैग नंबर चुनने के लिए वर्णमाला क्रम का उपयोग करके); AllFieldsBinaryFormatter की तरह थोड़ा काम करता है - फ़ील्ड्स क्रमबद्ध (फिर से, वर्णमाला) हैं।

मुझे याद नहीं है कि यह अभी भी v2 एपीआई पर उपलब्ध है; मुझे पता है कि काम सुनिश्चित करने के लिए यह मेरी चीजों की सूची पर है! लेकिन अगर आप के बिना विशेषताओं के बिना v2 में चाहते हैं, तो मुझे यकीन है कि मैं Add(ImplicitFields) अधिभार जोड़ सकता हूं।

जब तक 2 सिरों को कभी भी चरण से बाहर नहीं किया जाता है, यह ठीक है। यदि आप डेटा स्टोर करते हैं, या "चरण में" दो सिरों का संस्करण नहीं बनाते हैं, तो समस्याएं हो सकती हैं। Enum पर इंटेलिजेंस टिप्पणियां भी देखें (जो चेतावनी को दोहराती है कि आप पहले से ही जानते हैं)।

+0

धन्यवाद मार्क। मैं कक्षा परिभाषा पर प्रोटोकंट्रैक्ट के साथ जीवन के संकेतों को देखना शुरू कर रहा हूं, और मैं अभी v2 का उपयोग कर रहा हूं ... मैं इसे किसी भी विशेषताओं के साथ काम करने के लिए प्राप्त करने की कोशिश कर रहा हूं, मुझे एक ऐड (इम्प्लिटीफिल्ड्स)) अधिभार के रूप में जो कोड को इतना साफ रखता है ... – damageboy

+1

एक और इच्छा जो मैं चाहता हूं, ImplicitFields के लिए "रिकर्सिव" होना है, यानी, यदि मेरे पास एक श्रेणी X है जिसमें एक सूची है, और मैं जोड़ें (ImplicitFields का उपयोग करता हूं)) कि मैं कक्षाओं की श्रृंखला में प्रचार करने के लिए यह चाहता हूं .. – damageboy

+0

@damageboy शायद उस पते को संबोधित करने का तरीका टाइपमोडेल स्तर पर है - तो आप उस प्रकार से चूकने वाले एक प्रकार के मॉडल को खोल सकते हैं। वास्तव में यह वास्तव में InferByName (समान लेकिन संक्षेप में अलग) काम करता है। –

1

मुझे एक ही समस्या थी और मैंने इसे टाइपमोडेल के साथ कैसे हल किया है। यह गुण उनके नाम द्वारा आदेश दिया पर आधारित है (हालांकि यह संपत्ति सेटर/गेटर अस्तित्व पर जांच नहीं करता है या क्रमानुसार-क्षमता दिए गए प्रकार का):

[TestFixture] 
public class InferredProtoPoc 
{ 
    [Test] 
    public void UsageTest() 
    { 
     var model = TypeModel.Create(); 
     // Dynamically create the model for MyPoco 
     AddProperties(model, typeof(MyPoco)); 
     // Display the Generated Schema of MyPoco 
     Console.WriteLine(model.GetSchema(typeof(MyPoco))); 

     var instance = new MyPoco 
     { 
      IntegerProperty = 42, 
      StringProperty = "Foobar", 
      Containers = new List<EmbeddedPoco> 
      { 
       new EmbeddedPoco { Id = 12, Name = "MyFirstOne" }, 
       new EmbeddedPoco { Id = 13, Name = "EmbeddedAgain" } 
      } 
     }; 

     var ms = new MemoryStream(); 
     model.Serialize(ms, instance); 
     ms.Seek(0, SeekOrigin.Begin); 
     var res = (MyPoco) model.Deserialize(ms, null, typeof(MyPoco)); 
     Assert.IsNotNull(res); 
     Assert.AreEqual(42, res.IntegerProperty); 
     Assert.AreEqual("Foobar", res.StringProperty); 
     var list = res.Containers; 
     Assert.IsNotNull(list); 
     Assert.AreEqual(2, list.Count); 
     Assert.IsTrue(list.Any(x => x.Id == 12)); 
     Assert.IsTrue(list.Where(x => x.Id == 12).Any(x => x.Name == "MyFirstOne")); 
     Assert.IsTrue(list.Any(x => x.Id == 13)); 
     Assert.IsTrue(list.Where(x => x.Id == 13).Any(x => x.Name == "EmbeddedAgain")); 
    } 

    private static void AddProperties(RuntimeTypeModel model, Type type) 
    { 
     var metaType = model.Add(type, true); 
     foreach (var property in type.GetProperties().OrderBy(x => x.Name)) 
     { 
      metaType.Add(property.Name); 
      var propertyType = property.PropertyType; 
      if (!IsBuiltinType(propertyType) && 
       !model.IsDefined(propertyType) && 
       propertyType.GetProperties().Length > 0) 
      { 

       AddProperties(model, propertyType); 
      } 
     } 
    } 

    private static bool IsBuiltinType(Type type) 
    { 
     return type.IsValueType || type == typeof (string); 
    } 
} 

public class MyPoco 
{ 
    public int IntegerProperty { get; set; } 
    public string StringProperty { get; set; } 
    public List<EmbeddedPoco> Containers { get; set; } 
} 

public class EmbeddedPoco 
{ 
    public int Id { get; set; } 
    public String Name { get; set; } 
} 

और है कि तुम क्या यह चलने से मिलता है।

message EmbeddedPoco { 
     optional int32 Id = 1; 
     optional string Name = 2; 
    } 
    message MyPoco { 
     repeated EmbeddedPoco Containers = 1; 
     optional int32 IntegerProperty = 2; 
     optional string StringProperty = 3; 
    } 

प्रदर्शन के लिए, आप भविष्य उपयोगों के लिए उत्पन्न आद्य स्टोर TypeModel संकलित करने के लिए विकल्प चुन सकता है, और/या। सावधान रहें कि प्रोटोकॉल बफर पर छिपी निर्भरता लंबे समय तक खतरनाक हो सकती है यदि पोको (सादा पुरानी कंटेनर ऑब्जेक्ट) विकसित हो जाती है।

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

  • कोई संबंधित समस्या नहीं^_^