2013-04-08 2 views
2

J'ai une classe qui est décorée avec DataContract et ProtoContract (ImplicitFields = ImplicitFields.AllFields), l'un des membres et propriétés est Enum. Je suis en train de deepclone l'objet cependant lorsque la source a dans l'élément de ENUM la valeur qui est mis en correspondance à la valeur 0, après le clone je reçois la valeur par défautProblèmes DeepClone avec protobuf-net - using enums

La classe est:

public enum A { 
    A0 = 0, 
    A1 = 1, 
    A2 = 2 
} 
[ProtoContract(ImplicitFields = ImplicitFields.AllFields)] 
public class Ac { 
    private A _aa = A.A2; 
    public string sa { get; set; } 
    public A aa { get { return _aa; } set { _aa = value; } } 
} 

Avec code sérialisation:

Ac a1 = new Ac(); 
a1.sa = "dfdf"; 
a1.aa = A.A0; 
Ac a2 = new Ac(); 
a2.sa = "dfdf"; 
a2.aa = A.A1; 
var sa1 = Serializer.DeepClone<Ac>(a1); 
var sa2 = Serializer.DeepClone<Ac>(a2); 
+0

est-il possible que la valeur 0 est utilisée par défaut et ignorée à désirializetion? –

Répondre

3

Pour des raisons historiques, protobuf-net utilise un comportement "zéro implicites de défaut". Quelque chose que je regrette de v1 mais nous y sommes. La valeur par défaut implicite est donc 0 === A0. Vous pouvez cependant re-éduquer:

[DefaultValue(A.A2)] 
private A _aa = A.A2; 

(c.-à-dire le système ce que votre constructeur va faire)

Sinon, si vous êtes content que vous comprenez votre utilisation protobuf-net - vous peut modifier ce comportement:

RuntimeTypeModel.Default.UseImplicitZeroDefaults = false; 

dans ce cas, que par défaut explicite ([DefaultValue] et modèles conditionnels tels que ShouldSerialize*/*Specified) sont traitées.

+0

fondamentalement dans la solution complète j'utilise le modèle de type d'exécution pour l'héritage - je vais le vérifier maintenant, merci –

+0

même après avoir ajouté la valeur par défaut je reçois le même comportement, également essayé Default.UseImplicitZeroDefaults = false; sur le modèle d'exécution –

+0

can SkipConstructor = true help? –