2011-09-21 10 views
10

मैं कैसे Protobuf शुद्ध के साथ इस तरह एक वस्तु को क्रमानुसार करने:सीरियलाइज सूची <object> (जहां वस्तुएं प्राइमेटिव समर्थित हैं)?

public class MyObject{ 
    public string Key {get; set;} 
    public List<Object> Values {get; set;} 
} 

जब मैं एक TypeModel Protobuf शुद्ध बताते हुए यह System.Object क्रमानुसार करने के लिए कैसे पता नहीं है कि एक त्रुटि फेंकता के साथ इस क्रमानुसार करने की कोशिश । अब मुझे पता है कि मूल्यों में केवल प्राइमेटिव (int, स्ट्रिंग, फ्लोट, डेटटाइम इत्यादि) शामिल होंगे। तो मैं प्रोटोबफ-नेट को इस बारे में कैसे बता सकता हूं?

+0

दिनांक समय एक आदिम नहीं है List<int> का एक संयोजन, List<double>, साथ List<object> बदलें। –

+0

हालांकि, यह serializable है। – cHao

+0

मुझे प्रोटोबफ नहीं पता है लेकिन आप एक धारावाहिक से बहुत भयानक पूछ रहे हैं। –

उत्तर

9

यह किसी भी अर्थ में वास्तव में शुद्ध Protobuf में संभव नहीं है। ProtoBuf दृढ़ता से टाइप किया गया है, फिर भी संदेश में प्रकार की जानकारी नहीं है; प्रकार की जानकारी हमेशा बाहरी रूप से निर्दिष्ट होती है। इस प्रकार दो "अच्छे" समाधान हैं; हां, समाधान जो प्रोटोबफ-नेट के अलावा प्रोटोबफ कार्यान्वयन द्वारा व्याख्या करना आसान होगा (जिसे आप परवाह कर सकते हैं या नहीं, लेकिन मार्क निश्चित रूप से लगता है)।

1: List<PrimitiveType> जहां PrimitiveType शामिल वैकल्पिक फ़ील्ड सभी 12 या तो आदिम प्रकार के लिए इसी (। के "आदिम प्रकार" अपनी परिभाषा पर निर्भर करता है) के साथ List<object> बदलें, और आप यह सुनिश्चित केवल उन में से एक में पर भर जाता है प्रत्येक उदाहरण।

2: List<string> आदि

0

In Protobuf-net how can I pass an array of type object with objects of different types inside, knowing the set of potential types in advance देखें।

मार्क पोस्ट (Protobuf.NET के लेखक) object समस्याग्रस्त है। यद्यपि मुझे अभी यह नहीं मिल रहा है, लेकिन मुझे स्पष्ट रूप से धारावाहिक ऑब्जेक्ट गुणों के प्रयासों के खिलाफ अपवाद फेंकने के लिए स्रोत में object के लिए चेक देखने को याद है।

इस के आसपास काम करने के लिए आपको सीरियलाइज्ड होने के लिए एक और विशिष्ट वर्ग का उपयोग करना चाहिए और सीधे object का उपयोग नहीं करना चाहिए। आप कस्टम serialization/deserialisation लागू करने के लिए IProtoSerializer का उपयोग कर सकते हैं। प्रोटोबफ ISerializable और IXmlSerializable इंटरफेस का भी समर्थन करेगा यदि इससे मदद मिलती है।

+2

स्पष्टीकरण के लिए: protobuf-net नहीं * उपभोग * 'ISerializable' और न ही' IXmlSerializable' का उपभोग करें - बल्कि इसका उपयोग * उन्हें * लागू करने के लिए किया जा सकता है। 'IProtoSerializer' एक * आंतरिक * वर्ग है, और अलगाव में उपयोग नहीं किया जा सकता है। –

+0

@MarcGravell स्पष्टीकरण के लिए धन्यवाद। –

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