संपादित करें:
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; }
}
स्रोत
2012-09-18 11:10:08
अद्यतन जवाब देखें; यह वास्तव में बाद में –