Подтвердить что ты не робот

Серийная сериализация protobuf-net

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

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

4b9b3361

Ответ 1

Я подозреваю, что на самом деле это два разных сценария, но в отношении примера кода, добавленного Эндрю, это потому, что он не может понять (заранее), что он собирается делать с учетом значений по умолчанию (по умолчанию, данные обрабатываются как дополнительные в приемнике). Есть 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; }

Ответ 2

Пример:

[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; }
}