2012-09-18 9 views
9

मैं जब List<Tuple<string, Type, object>> क्रमानुसार करने की कोशिश कर निम्न त्रुटि संदेश हो रही है: नहीं Serializer प्रकार के लिए परिभाषित किया गया: System.TypeProtobuf नेट त्रुटि संदेश: नहीं Serializer प्रकार के लिए परिभाषित किया गया: System.Type

मैं दोनों की कोशिश की, सिर्फ serializing उपरोक्त संग्रह या एक वर्ग को क्रमबद्ध करना जिसमें समान संग्रह है जिसे protoMember के रूप में परिभाषित किया गया है। दोनों एक ही त्रुटि संदेश में परिणाम।

क्या यह एक गैर-समर्थित प्रकार है? मुझे लगता है कि यह समर्थित है और मैंने कुछ और अनदेखा किया लेकिन शायद मैं गलत हूं?

किसी भी संकेत दिए गए के लिए धन्यवाद है कि इस को हल करने में मदद कर सकते हैं ...

+0

अद्यतन जवाब देखें; यह वास्तव में बाद में –

उत्तर

12

संपादित करें:

Type क्रमबद्धता के लिए समर्थन R580


Protobuf-जाल में शामिल किया गया है अपने क्रमानुसार करने का इरादा है डेटा, आपके कार्यान्वयन नहीं; Type एक कार्यान्वयन विस्तार है। कड़ाई से बोलना, इसे जोड़ने में काफी मुश्किल नहीं होगी (कार्यान्वयन-विशिष्ट विवरणों में से कुछ पहले ही अनिवार्य रूप से असेंबली-योग्य-नाम के माध्यम से Type जानकारी संग्रहीत करना समाप्त कर देते हैं), लेकिन: यह एक महत्वपूर्ण परिदृश्य नहीं है, और कई में तरीके कुछ नहीं है जो मैं आपको क्रमबद्ध करने के लिए प्रोत्साहित करता हूं - प्रोटोकॉल बफर का पूरा बिंदु यह है कि आप संस्करण सहिष्णुता के साथ किसी भी प्लेटफॉर्म पर डेटा लोड कर सकते हैं। भंडारण Type जानकारी इन दोनों का उल्लंघन करती है।

यह भी ध्यान दिया जाना चाहिए कि सबसे अन्य serializers (शायद BinaryFormatter, जो पहले से ही मंच/संस्करण सहिष्णुता के हर नियम को तोड़ता को छोड़कर) होगा भी एक Type क्रमानुसार करने से मना; XmlSerializer, DataContractSerializer, JavaScriptSerializer आदि सभी इस परिदृश्य के लिए अपवाद फेंक दिया (मैंने अभी उन्हें चेक किया है)।

इसके अतिरिक्त: objectभी कम समर्थन-है, जब तक आप DynamicType सुविधा का उपयोग।


यह इस प्रकार से एक किराए के माध्यम से किया जा सकता है Type पर है:

using ProtoBuf; 
using ProtoBuf.Meta; 
using System; 
using System.Runtime.Serialization; 

static class Program 
{ 
    public static void Main(string[] args) 
    { 
     // register a surrogate for Type 
     RuntimeTypeModel.Default.Add(typeof(Type), false) 
           .SetSurrogate(typeof(TypeSurrogate)); 
     // test it 
     var clone = Serializer.DeepClone(new Foo { Type = typeof(string) }); 
    } 
} 

[ProtoContract] 
class TypeSurrogate 
{ 
    [ProtoMember(1)] 
    public string AssemblyQualifiedName { get; set; } 
    // protobuf-net wants an implicit or explicit operator between the types 
    public static implicit operator Type(TypeSurrogate value) 
    { 
     return value==null ? null : Type.GetType(value.AssemblyQualifiedName); 
    } 
    public static implicit operator TypeSurrogate(Type value) 
    { 
     return value == null ? null : new TypeSurrogate { 
      AssemblyQualifiedName = value.AssemblyQualifiedName }; 
    } 
} 

[DataContract] 
public class Foo 
{ 
    [DataMember(Order=1)] 
    public Type Type { get; set; } 
} 
+0

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

+0

@Freddy वास्तव में, सबसे आसान बात 'स्ट्रिंग, स्ट्रिंग, ऑब्जेक्ट' को'AssemblyQualifiedName' और 'Type.GetType (string)' का उपयोग करके स्टोर करना होगा। यदि आप * वास्तव में * विदेशी प्राप्त करना चाहते थे, तो आप शायद 'टाइप' के लिए * सरोगेट * जोड़ सकते हैं (प्रोटोबफ-नेट इसका समर्थन करता है)। तकनीकी स्तर पर, मैं * बिना किसी दर्द के सीधे इसका समर्थन कर सकता हूं, लेकिन ऐसा लगता है कि मैं लोगों को पैर में खुद को शूट करने के लिए आसान बनाना चाहता हूं ... एक बाजुका के साथ। पॉइंटर्स के लिए –

+0

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

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