thrift idl version test
프로그래밍 2015. 4. 27. 15:56
thrift idl version
thrift idl에 정의한 구조체는 지속적으로 변한다.
모바일 게임은 구/신 버전의 클라가 신 버전의 서버에 연결되는 일이 있다.
idl이 서로 달라졌을 때 어떻게 될지 테스트 해보았다.
클라와 서버에 정의된 초기 버전의 구조체
1 2 3 4 | struct SharedStructV1 { 1 : i32 key 2 : string name } |
클라는 초기 버전의 구조체를 갖고, 서버는 지속적으로 아래와 같이 구조체가 변한다고 가정
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | 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 } |
테스트 코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | 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)); } |
테스트 로그
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | 동일한 구조체 사용 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 |
결론
초기 구조체에 정의된 필드의 순서번호나 타입이 변경되지 않으면서
필드 추가와 삭제가 있는 경우 버전 호환이 가능할 것 같다.