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

합니다 NewClass에 OldClass를 역 직렬화 할 수있는 방법이 있나요를? 기본적으로 일부 멤버를 이동하여 컨테이너를 유지할 컨테이너 하위 클래스를 만들고 싶습니다. 그러나 이미 많은 SerialClass 클래스가 직렬화되어 디스크에 저장되어 있으며이를로드 할 수 있기를 원합니다.

이러한 X, Y, Z 멤버는 항상 int와 같은 기본 유형이 아닙니다. 두 개의 다른 필드에 대해 동일한 부재 인덱스를 사용하고 있기 때문에

답변

1

직렬화 OldClass 데이터 만 XZ 또는 XY 하나를 두 개의 값을 포함한다.

이 문제를 가지고 있지 않은 가정하면, 당신은 단지 주변 OldClass을 유지 OldClass에 직렬화 한 다음 OldClass 받아 NewClass에 생성자를 가질 수있다. ProtoBuf는 그것에 대해 알 필요가 없습니다.

+0

좋습니다. – Michal

+0

여러 OldClass 인스턴스와 NewClass 인스턴스를 서로 다른 파일에 직렬화 한 다음 NewClass로 deserialize해야하는 경우 어떻게해야합니까? 그냥'try {DeserializeToNewClass()} catch (WrongClassException) {DeserializeToOldClass();를 추가하십시오. ConvertOldToNew();}'블록? – Michal

+0

더 나은 옵션이 있는지 잘 모르겠습니다. – Rotem