2016-03-14 3 views
0

У меня есть базовый класс с именем PrivilegeType и он унаследован различными другими классами. Все работает нормально, за исключением одного определенного поля под названием PossibleValues, который не получает сериализованного/десериализованного значения.ProtoBuf не сериализует поле в унаследованном классе

определение Базовый класс:

[ProtoContract] 
[ProtoInclude(13, typeof(PrivilegeEnum))] 
public abstract class PrivilegeType { 
... 
} 

PrivilegeEnum определение:

[ProtoContract] 
public class PrivilegeEnum : PrivilegeEnumLike<PrivilegeEnumValue> { 
... 
} 

PrivilegeEnumLike<T> определение:

[ProtoContract] 
public abstract class PrivilegeEnumLike<T> : PrivilegeType<T> 
{ 
    [ProtoMember(2)] 
    public Dictionary<string, PrivilegeEnumValue> PossibleValues; 
    ... 
} 

PrivilegeEnumValue определение:

[ProtoContract] 
public class PrivilegeEnumValue 
{ 
    [ProtoMember(1)] 
    public string Value; 
    [ProtoMember(2)] 
    public string Text; 
    [ProtoMember(3)] 
    public HashSet<PrivilegeEnumValue> ImpliedValues = new HashSet<PrivilegeEnumValue>(); 
    ... 
} 

Дело в том, что поле определяется в PrivilegeEnumLike<T>, которая не включена в ProtoInclude сам список, но его подклассы. Я не могу добавить PrivilegeEnumLike<> в список ProtoInclude, потому что, я думаю, это не имеет смысла.

+0

Почему в мире вы, ребята, отмечаете этот вопрос как дубликат? Где в связанном вопросе это упоминается ?! «ProtoInclude» очевиден, и я знал это, прежде чем задавать этот вопрос. Пожалуйста, по крайней мере, прочитайте вопрос, прежде чем отмечать его как дубликат. – Javid

ответ

1

Вот правило:

Иерархия классов должны быть выполнены правильно. Это означает, что вы должны использовать ProtoInclude на родитель классы, НЕ обязательно базовые классы В противном случае, любой класс наследуется от подкласса и BaseClass будет не получить сериализации.

Что я сделал: класс

Base:

[ProtoContract] 
[ProtoInclude(12, typeof(PrivilegeEnumLike<PrivilegeEnumValue>))] 
[ProtoInclude(13, typeof(PrivilegeEnumLike<PrivilegeEnumValue[]>))] 
public abstract class PrivilegeType 

Средний класс:

[ProtoContract] 
[ProtoInclude(20, typeof(PrivilegeEnum))] 
[ProtoInclude(21, typeof(PrivilegeEnumSet))] 
public abstract class PrivilegeEnumLike<T> : PrivilegeType<T> 

Все правильно работает в настоящее время. Пожалуйста, дайте мне знать, если есть лучшее решение.

Смежные вопросы