2012-11-09 14 views
6

में सिस्टम.विर्सन के लिए परिभाषित कोई सीरियलाइज़र नवीनतम प्रोटोबफ-नेट (2.0.0.601) को अपडेट करने के बाद अब सिस्टम सिस्टम के मूल्य को क्रमबद्ध करने का प्रयास करते समय मुझे अपवाद मिलता है। वर्जन।प्रोटोबफ-नेट

[ProtoContract(SkipConstructor=true)] 
public class ServerLoginInfo 
{ 
    [ProtoMember(1)] 
    public Version ServerVersion { get; set; } 
} 

यह कुछ भी विशेष किए बिना 2.0.0.480 में ठीक काम करता था।

क्या यह नए संस्करण में काम करना संभव है या पुराने संस्करण में रोलबैक करने का मेरा एकमात्र विकल्प है?

(मैं भी क्रमबद्धता/अक्रमांकन जरूरत पुराने Protobuf शुद्ध संस्करण के साथ पीछे की ओर संगत होना।)

उत्तर

3

मैं इस AllowParseableTypes से संबंधित है संदेह है - यानी कि क्या यह एक fallback के रूप में एक स्थिर पार्स विधि के लिए लग रहा है। अगर मुझे याद है, तो इसे डिफ़ॉल्ट मॉडल पर सक्षम नहीं किया जा सकता है, लेकिन मुझे लगता है कि मैं अगले तैनाती में उस प्रतिबंध को हटा दूंगा। लेकिन अब के लिए:

var model = TypeModel.Create(); 
model.AllowParseableTypes = true; 

फिर दुकान मॉडल (और यह पुन: उपयोग), और model.Serialize/model.Deserialize का उपयोग करें।

मैं इस डिफ़ॉल्ट मॉडल प्रतिबंध है, तो बस को बदलते हैं:

RuntimeTypeModel.Default.AllowParseableTypes = true; 
+0

बहुत तेजी से उत्तर के लिए धन्यवाद। मैं अब प्रोटोबफ-नेट के पुराने संस्करण से चिपके रहूंगा क्योंकि बदलाव के लिए बहुत सारे बदलावों की आवश्यकता होगी। 'RuntimeTypeModel.Default.AllowParseableTypes = true;' भविष्य के संस्करण में इसे बहुत आसान बना देगा। पी.एस. एक महान पुस्तकालय के लिए धन्यवाद :) –

+0

@andy मैं आज बाद में कुछ chnges बनाने का इरादा रखता हूं - मैं देखता हूं कि मैं इसे –

+0

में निचोड़ सकता हूं ठीक है, अच्छा लगता है। धन्यवाद फिर से @MarcGravell –

1

मैं बजाय संस्करण के लिए एक किराए का उपयोग कर, क्योंकि AllowParseableTypes विकल्प को सक्षम करने के लिए अन्य प्रकार के कुछ विन्यास को निष्क्रिय करने के पक्ष प्रभाव हो सकता है की सिफारिश करेंगे जो AllowParseableTypes पर लागू होते हैं।

अधिक यहाँ विस्तार: https://github.com/mgravell/protobuf-net/issues/183

यह इस तरह से करने के लिए, निम्न प्रारंभकर्ता जोड़ें:

RuntimeTypeModel.Default.Add(typeof(Version), false).SetSurrogate(typeof(VersionSurrogate)); 

और निम्न प्रकार:

[ProtoContract] 
public class VersionSurrogate 
{ 
    [ProtoMember(1)] 
    public string Version { get; set; } 

    public static implicit operator VersionSurrogate(Version value) 
    { 
     return new VersionSurrogate 
     { 
      Version = value.ToString() 
     }; 
    } 

    public static implicit operator Version(VersionSurrogate value) 
    { 
     return System.Version.Parse(value.Version); 
    } 
}