BigDecimal/BigInteger를 프로토콜 버퍼로 직렬화하기위한 가장 좋은 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1051732

  •  20-08-2019
  •  | 
  •  

문제

사용자 정의 직렬화 메커니즘을 프로토콜 버퍼로 마이그레이션하기 시작했습니다. 특히 정기적으로 사용될 데이터 유형 중 하나는 BigDecimal.

프로토콜 버퍼 내에서 이것을 직렬화하는 좋은 방법을 아는 사람이 있습니까? 현재 직렬화 루틴이 사용됩니다 BigDecimal.toPlainString() 직렬화를 위해 new BigDecimal(String) 사막화를 위해 - 나는 더 나은 방법이 있다고 가정합니다.

제 생각에는 a를 정의하는 것입니다 BigDecimal 처럼:

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

그러나 나는 어떻게 정의 해야할지 잘 모르겠습니다 BigInteger - 아마도 그것을 사용합니다 toByteArray() 방법?

도움이 되었습니까?

해결책

예. biginteger를 biginteger.tobytearray ()로 정의해야합니다.

내 생각에 큰도는 다음과 같습니다.


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

Biginteger는 다음과 같이 정의 될 수 있습니다


message BInteger {
  required bytes value = 1;
}

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

다른 팁

왜 그것을 바꾸고 싶습니까? 당신이 실제 요구가있을 수 있거나 실제 요구가 있기 때문에 (프로파일 링 세션을 확인하는 것처럼, 직렬화/사막화는 대부분의 시간이 걸립니다).

나는 그것이 내장되어 있기 때문에 문자열을 사용합니다. :)

제안 된 바이트 어레이 접근법 (BigDecimal/BigInteger를 프로토콜 버퍼로 직렬화하기위한 가장 좋은 방법은 무엇입니까?) 문자열 표현이 문제가된다면 나에게 괜찮은 것 같습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top