Stavo cercando di aggiungere un nuovo valore enum per una certa classe protobuf serializzata in una nuova versione dell'app e, durante i test, ho notato che la versione precedente genererà un'eccezione, dato questo nuovo formato di file :Protobuf-net enum retrocompatibilità
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
E 'abbastanza ovvio che mi sta dicendo che non v'è alcun valore enum per il valore int
di 3
, ma ho sempre avuto l'idea che Protocol Buffers defaulted to the zero-valued ("default") enum value (se esiste), nel caso in cui un valore di enumerazione reale non può essere mappato a
Per chiarire, questo può essere riprodotto utilizzando il seguente esempio (sto volutamente facendo il passo deserializzazione in una classe diversa per imitare vecchia applicazione che carica il nuovo formato):
// --- 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; }
}
E il seguente codice fallirà:
// 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);
Dal V1 è alla luce del sole, c'è qualche metadati posso usare durante la serializzazione in v2 per evitare questo problema? Posso, naturalmente, tirarmi fuori da questo problema riscrivendo la v2 per usare una proprietà separata e lasciare i valori enum non modificati, ma mi piacerebbe rendere l'enumerazione compatibile all'indietro se possibile.
Cosa dovrebbe accadere a '' v1roundtrip.Value' quando EnumV2.Three' è stato inviato? – Caramiriel
@ Caramiriel: Secondo la mia comprensione (spiegato in [questa discussione] (http://stackoverflow.com/q/10392952/69809), avrebbe dovuto essere impostato su "EnumV1.Default" invece di generare un'eccezione. Questo è quello che mi aspetterei se volessi assicurarmi che il formato sia retrocompatibile. Ad esempio, [questo utente] (http://stackoverflow.com/a/13924171/69809) sembra aver avuto lo stesso problema e lo ha corretto aggiungendo un valore enum predefinito (zero), senza ulteriori attributi protobuf necessari. – Groo
ping @marcgravell – jgauffin