thrift idl version
thrift idl에 정의한 구조체는 지속적으로 변한다.
모바일 게임은 구/신 버전의 클라가 신 버전의 서버에 연결되는 일이 있다.
idl이 서로 달라졌을 때 어떻게 될지 테스트 해보았다.
클라와 서버에 정의된 초기 버전의 구조체
struct SharedStructV1 {
1: i32 key
2: string name
}
클라는 초기 버전의 구조체를 갖고, 서버는 지속적으로 아래와 같이 구조체가 변한다고 가정
struct SharedStructV2 {
1: i32 key
2: string name
}
struct SharedStructV3 {
1: i32 key
3: string name
}
struct SharedStructV4 {
1: i32 key1
2: string name1
}
struct SharedStructV5 {
1: i32 key
}
struct SharedStructV6 {
1: i32 key
2: string name
3: string name1
}
struct SharedStructV7 {
1: string name
2: i32 key
}
테스트 코드
public static void main( String[] args )
{
System.out.println( "Hello World!" );
// write
SharedStructV1 wV1 = new SharedStructV1();
wV1.key = 1;
wV1.name = "test";
Write(wV1);
// read and compare
SharedStructV1 rV1 = Read(SharedStructV1.class, SharedStructV1.class);
System.out.println("동일한 구조체 사용");
System.out.println(wV1.toString() + " == " + rV1.toString());
System.out.println(wV1.key == rV1.key && wV1.name.equals(rV1.name));
SharedStructV2 rV2 = Read(SharedStructV1.class, SharedStructV2.class);
System.out.println("구조체 이름을 변경함");
System.out.println(wV1.toString() + " == " + rV2.toString());
System.out.println(wV1.key == rV2.key && wV1.name.equals(rV2.name));
SharedStructV3 rV3 = Read(SharedStructV1.class, SharedStructV3.class);
System.out.println("필드 순서번호를 변경함");
System.out.println(wV1.toString() + " == " + rV3.toString());
System.out.println(wV1.key == rV3.key && wV1.name.equals(rV3.name));
SharedStructV4 rV4 = Read(SharedStructV1.class, SharedStructV4.class);
System.out.println("필드명을 변경함");
System.out.println(wV1.toString() + " == " + rV4.toString());
System.out.println(wV1.key == rV4.key1 && wV1.name.equals(rV4.name1));
SharedStructV5 rV5 = Read(SharedStructV1.class, SharedStructV5.class);
System.out.println("필드 제거함");
System.out.println(wV1.toString() + " == " + rV5.toString());
System.out.println(wV1.key == rV5.key);
SharedStructV6 rV6 = Read(SharedStructV1.class, SharedStructV6.class);
System.out.println("필드 추가함");
System.out.println(wV1.toString() + " == " + rV6.toString());
System.out.println(wV1.key == rV6.key && wV1.name.equals(rV6.name));
SharedStructV7 rV7 = Read(SharedStructV1.class, SharedStructV7.class);
System.out.println("필드 타입을 변경함");
System.out.println(wV1.toString() + " == " + rV7.toString());
System.out.println(wV1.key == rV7.key && wV1.name.equals(rV7.name));
}
테스트 로그
동일한 구조체 사용
SharedStructV1(key:1, name:test) == SharedStructV1(key:1, name:test)
true
구조체 이름을 변경함
SharedStructV1(key:1, name:test) == SharedStructV2(key:1, name:test)
true
필드 순서번호를 변경함
SharedStructV1(key:1, name:test) == SharedStructV3(key:1, name:null)
false
필드명을 변경함
SharedStructV1(key:1, name:test) == SharedStructV4(key1:1, name1:test)
true
필드 제거함
SharedStructV1(key:1, name:test) == SharedStructV5(key:1)
true
필드 추가함
SharedStructV1(key:1, name:test) == SharedStructV6(key:1, name:test, name1:null)
true
필드 타입을 변경함
SharedStructV1(key:1, name:test) == SharedStructV7(name:null, key:0)
false
결론
초기 구조체에 정의된 필드의 순서번호나 타입이 변경되지 않으면서
필드 추가와 삭제가 있는 경우 버전 호환이 가능할 것 같다.