Сериализация перечислений protobuf-net - PullRequest
14 голосов
/ 09 ноября 2010

Что нужно сделать для сериализации перечислений с protobuf-net? Я получаю приведенную ниже ошибку при сериализации класса, имеющего свойство enum, если атрибут DataMember удален из объявления свойства, он работает нормально.

"System.InvalidOperationException: только классы контракта данных (и списки / массивы таких) могут быть обработаны "

Ответы [ 2 ]

17 голосов
/ 15 ноября 2010

I подозреваю на самом деле это 2 разных сценария, но в отношении примера кода, добавленного Эндрю, это потому, что он не может выяснить (заранее), что он собирается делать с к значениям по умолчанию (по умолчанию данные обрабатываются как необязательные в приемнике ). Есть 3 способа исправить это:

1: добавить перечисление со значением 0 (поскольку 0 всегда является значением CLI по умолчанию для нулей), например

public enum SiteType
{
    Error = 0,
    ...

2: укажите, какое значение использовать по умолчанию:

[ProtoMember(10), DefaultValue(SiteType.Partition)]
public SiteType Type { get; set; }

3: скажите движку, что ему действительно не нужно беспокоиться об этом, то есть, что будет иметь значение:

[ProtoMember(10, IsRequired = true)]
public SiteType Type { get; set; }
4 голосов
/ 15 ноября 2010

Образец:

[DataContract]
[ProtoContract]
public enum SiteType
{
    [EnumMember]
    [ProtoEnum]
    Site = 1,
    [EnumMember]
    [ProtoEnum]
    Partition = 2,
    [EnumMember]
    [ProtoEnum]
    Module = 3
}

[DataContract]
[Serializable]
[ProtoContract]
public class SiteDTO
{
    [DataMember]
    [ProtoMember(1)]
    public int Id { get; set; }
    ...
    [DataMember]
    [ProtoMember(10)]
    public SiteType Type { get; set; }
}
...