2009-06-26 4 views
15

사용자 지정 직렬화 메커니즘을 프로토콜 버퍼로 마이그레이션하기 시작했습니다. 특히 자주 사용되는 하나의 데이터 유형은 BigDecimal입니다.BigDecimal/BigInteger를 ProtocolBuffers로 serialize하는 최상의 방법은 무엇입니까

누군가 프로토콜 버퍼 내에서 이것을 직렬화하는 좋은 방법을 알고 있습니까? 현재의 직렬화 루틴은 직렬화에 BigDecimal.toPlainString()을 사용하고 직렬화에 새로운 BigDecimal (String)을 사용합니다. 더 좋은 방법이 있다고 가정합니다.

내 생각대로 인 BigDecimal를 정의하는 것입니다 :

message BDecimal { 
    required int32 scale = 1; 
    required BInteger int_val = 2; 
} 

하지만 BigInteger를 정의하는 방법을 너무 확실하지 않다 - 아마도 그 toByteArray() 메소드를 사용하고 계십니까?

답변

10

예. BigInteger를 BigInteger.toByteArray()로 정의해야합니다.

내 생각 엔 BigDecimal를 될 것입니다 : BigInteger를가


message BInteger { 
    required bytes value = 1; 
} 

처리하는 코드로 정의 될 수 있지만


message BDecimal { 
    required int32 scale = 1; 
    required BInteger int_val = 2; 
} 

는 BigInteger를 다음과 같습니다


    BInteger write(BigInteger val) { 
    BInteger.Builder builder = BInteger.newBuilder(); 
    ByteString bytes = ByteString.copyFrom(val.toByteArray()); 
    builder.setValue(bytes); 
    return builder.build(); 
    } 

    BigInteger read(BInteger message) { 
    ByteString bytes = message.getValue(); 
    return new BigInteger(bytes.toByteArray()); 
    } 
+2

어떻게 BigDecimal을 BigInteger와 스케일로 변환하겠습니까? 그리고 다시? – stikkos

+1

필자는 처음에'toByteArray'를 사용하는 이식 방법이 이식성이 없다고 우려했습니다. (Java 이외의 다른 언어에서 의미없는 역 직렬화를 할 수는 없습니다. 처음에는 protobuf를 사용하는 주된 이유 중 하나입니다.) 그러나 ['BigInteger.toByteArray'] (http://docs.oracle.com/javase/6/docs/api/java/math/BigInteger.html#toByteArray())에 대한 명세는 매우 구체적이고 쉽게 사용할 수 있습니다. 다른 언어 (예 : [.net BigInteger] (http://msdn.microsoft.com/en-us/library/dd268207(v=vs.110).aspx), 엔디안이 등장 할 때주의해야합니다. 다른). – bacar

1

왜 당신을 그것을 바꾸고 싶습니까? 프로파일 링 세션 확인과 같은 실질적인 필요성이 있거나 그럴 필요가 있기 때문에 직렬화/역 직렬화가 대부분의 시간을 필요로합니다. 이 :

캐릭터 라인 표현이 문제가 될 것으로 보인다 경우 제안 된 바이트 배열 방식 (What is the best approach for serializing BigDecimal/BigInteger to ProtocolBuffers가), 나에게 좋은 것 같습니다에 내장되어해서

나는, 문자열을 사용합니다.

+2

성능 최적화보다는 네트워크 최적화 문제라고 생각합니다. String은 많은 메모리가 필요합니다. Integer.MAX_VALUE (2147483647) 예를 들어, 24 바이트의 순서로 문자열로 필요하지만 8 바이트 만 바이트 배열로 필요합니다. – notnoop