मैं एक नए ऐप संस्करण में एक निश्चित प्रोटोबफ-सीरियलाइज्ड क्लास के लिए एक नया एनम मान जोड़ने की कोशिश कर रहा था, और परीक्षण करते समय, ध्यान दिया गया कि पिछले संस्करण को एक नया अपवाद फेंक दिया जाएगा, :प्रोटोबफ-नेट एनम पिछड़ा संगतता
An unhandled exception of type 'ProtoBuf.ProtoException' occurred in protobuf-net.dll Additional information: No {enum-type-name} enum is mapped to the wire-value 3
यह काफी स्पष्ट है कि यह मुझे बता रही है 3
की int
मूल्य के लिए कोई enum मूल्य नहीं होता है कि है, लेकिन मैं हमेशा विचार था कि Protocol Buffers defaulted to the zero-valued ("default") enum value (यदि ऐसा मौजूद है), के मामले में है कि एक वास्तविक enum मूल्य मैप नहीं किया जा सका।
स्पष्ट करने के लिए, इस reproduced किया जा सकता है कि निम्न उदाहरण (मैं जानबूझकर एक अलग वर्ग में अक्रमांकन कदम कर रहा हूँ नए प्रारूप लोड करने का प्रयास पुराने एप्लिकेशन को नकल करने के लिए) का उपयोग कर:
// --- version 1 ---
public enum EnumV1
{
Default = 0,
One = 1,
Two = 2
}
[ProtoContract]
public class ClassV1
{
[ProtoMember(1)]
public EnumV1 Value { get; set; }
}
// --- version 2 ---
public enum EnumV2
{
Default = 0,
One = 1,
Two = 2,
Three = 3 // <- newly added
}
[ProtoContract]
public class ClassV2
{
[ProtoMember(1)]
public EnumV2 Value { get; set; }
}
और निम्नलिखित कोड असफल हो जायेगी:
// serialize v2 using the new app
var v2 = new ClassV2() { Value = EnumV2.Three };
var v2data = Serialize(v2);
// try to deserialize this inside the old app to v1
var v1roundtrip = Deserialize<ClassV1>(v2data);
v1 के बाद से खुले में बाहर है, वहाँ कुछ मेटाडाटा जब वी 2 में serializing इस समस्या से बचने के लिए मैं उपयोग कर सकते हैं? मैं निश्चित रूप से, एक अलग संपत्ति का उपयोग करने के लिए v2 को फिर से लिखकर इस समस्या से खुद को प्राप्त कर सकता हूं और enum मानों को अनमोडिफाइड छोड़ सकता हूं, लेकिन यदि संभव हो तो मैं पीछे की तरफ संगत बनाना चाहता हूं।
'v1roundtrip.Value' का क्या होगा जब' EnumV2.Three' भेजा गया था: यहाँ EnumSerializer.cs अंदर समस्याग्रस्त कोड (
ISSUE #422
टिप्पणी मेरी है) है? – Caramiriel@Caramiriel: मेरी समझ के अनुसार ([इस धागे] में वर्णित है (http://stackoverflow.com/q/10392952/69809)), इसे अपवाद फेंकने के बजाय 'EnumV1.Default' पर सेट किया जाना चाहिए था। अगर मैं यह सुनिश्चित करना चाहता हूं कि प्रारूप पीछे की ओर संगत है तो मैं यही उम्मीद करूंगा। उदाहरण के लिए, [इस उपयोगकर्ता] (http://stackoverflow.com/a/13924171/69809) में एक ही समस्या थी, और डिफ़ॉल्ट (शून्य) enum मान जोड़कर इसे ठीक किया गया, जिसमें कोई अतिरिक्त प्रोटोबफ गुण आवश्यक नहीं था। – Groo
पिंग @marcgravell – jgauffin