2015-01-07 2 views
2

Скажем, у меня есть этот класс:Protobuf-сеть обратная совместимость

[ProtoContract] 
public class OldClass 
{ 
    [ProtoMember(1)] int X; 
    [ProtoMember(2)] int Y; 
    [ProtoMember(2)] int Z; 
} 

Если изменить OldClass на:

[ProtoContract] 
public class NewClass 
{ 
    Container container; 
    [ProtoMember(2)] int Z; 
} 

[ProtoContract] 
public class Container 
{ 
    [ProtoMember(1)] int X; 
    [ProtoMember(2)] int Y; 
} 

Есть ли способ десериализации OldClass в NewClass? В основном я хотел бы перемещать некоторые элементы вокруг, создавая некоторые подклассы контейнеров, которые будут их удерживать, но у меня есть много классов OldClass, которые уже сериализованы и сохранены на диске, и хотели бы иметь возможность их загружать.

Эти элементы X, Y, Z не всегда являются примитивными типами, такими как int.

ответ

1

Сериализованный OldClass данных содержит только два значения, либо X и Z или X и Y, потому что вы используете один и тот же индекс члена для двух различных полей.

Предполагая, что у вас не было этой проблемы, вы можете просто держать OldClass вокруг, десериализации в OldClass, а затем конструктор на NewClass, который принимает OldClass. ProtoBuf не нужно знать об этом.

+0

Это хорошая идея. – Michal

+0

Что делать, если я сериализовал несколько экземпляров OldClass, а также экземпляры NewClass для разных файлов, и теперь вам нужно десериализовать NewClass? Просто добавьте 'try {DeserializeToNewClass()} catch (WrongClassException) {DeserializeToOldClass(); ConvertOldToNew();} 'block? – Michal

+0

Не уверен, что есть лучший вариант. – Rotem

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