2013-08-07 4 views
1

Есть ли способ обеспечить обратную совместимость при изменении типа члена? Например, класс Person состоит в 1-й версии одного целого числа, но в версии 2 строки. Я знаю, что это нарушает контракт, но пример - это проблема, которая редко возникает в разработке программного обеспечения реальной жизни.protobuf-net: обратная совместимость при изменении типа?

Заранее спасибо.

// Version 1 
[ProtoContract] 
class Person 
{ 
    [ProtoMember(1)] 
    public int ID { get; set; } 
} 

// Version 2 
[ProtoContract] 
class Person 
{ 
    [ProtoMember(1)] 
    public string ID { get; set; } 
} 

ответ

2

Свойство прокладка, вероятно, ваш лучший выбор:

// Version 2 
[ProtoContract] 
class Person 
{ 
    [ProtoMember(1)] 
    private int? ID_v1 { 
     get { return null; } // means it won't be serialized 
     set { if(value != null) ID = value.ToString(); } 
    } 

    [ProtoMember(2)] 
    public string ID { get; set; } 
} 
+0

Спасибо, но два вопроса: 1. это не является договором перерыв, когда мы изменяем тип из «межд» на «Int? ' ? Означает ли это, что – Guenter

+0

<Извините, забудьте первый комментарий, вот и весь> Спасибо большое, но два вопроса: 1. Разве это не разрыв контракта, когда мы меняем тип от 'int' до 'int?' ? 2. Нет сериализации null? Я беспокоюсь о том, что в моем двоичном файле может быть много старого «мусора». У меня также есть озабоченность по поводу десериализации: даже если ID_v1 имеет значение null, он может потерять память или я ошибаюсь? – Guenter

+1

@Guenter 1) нет, protobuf-net не будет рассматривать 'int' <===>' int? 'Как разрыв контракта, потому что на уровне protobuf (спецификация проводов) это просто необязательный' int'; 2) на уровне протобуфа нет понятия «null» - опять же, это просто будет рассматриваться как необязательное значение, где «null» говорит «не пишите это», поэтому он будет * читать *, если он находится в потоке, но он никогда не будет * записан *. Таким образом, он никогда не заберет память в потоке, и потому что нет * поля *, он не займет никакой памяти в объекте –

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