프로토콜 버퍼 : int64 또는 고정 64를 사용하여 .NET DateTime 값을 나타 내야합니까?

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

문제

프로토콜 버퍼 메시지에서 .NET DateTime 값을 직렬화해야합니다.

내 계획은 DateTime.tobinary ()를 사용한 다음 메시지에서 64 비트 반환 값을 전달하는 것입니다. 그러나이를 나타내는 프로토콜 버퍼 데이터 유형으로 무엇을 선택 해야하는지 잘 모르겠습니다.

나는 내가 혼란스러워하는 것 같다 고정 된 64 (또는 sfixed64) 데이터 유형을 사용해야하는 경우.

이 시나리오에서는 datetime.tobinary ()가 반환 한 값이 음수적이고 양수 일 수 있으므로 서명 된 유형을 사용한다고 가정합니다.

도움이 되었습니까?

해결책

글쎄, 당신도 확실히 원합니다 int64 또는 sfixed64 서명 된 가치에 대처합니다.

빠른 테스트를 수행 한 후 DateTime.Now.ToBinary() 10 바이트로 인코딩됩니다 int64 반면 sfixed64 항상 8 바이트를 사용합니다. 기본적으로 가변 길이 인코딩은 적은 숫자에 적합하지만 많은 숫자에 대한 고정 인코딩보다 커집니다. (UTF-16 대신 UTF-8을 사용하는 것과 동일한 트레이드 오프입니다. ASCII 문자는 단일 바이트에서 UTF-8로 인코딩 될 수 있지만 나중에 코드 포인트에서는 2와 3 바이트로 인코딩되면 UTF -16은 항상 BMP의 문자에 2 바이트를 사용합니다.)

내 생각은 그게 다 DateTime.ToBinary() 값은 ~할 것 같은 상당히 크게 sfixed64 더 적합합니다.

말이 돼?

다른 팁

~ 안에 protobuf-net, 나는 졸업 한 척도 접근법을 사용합니다 (실제로, 당신이 단순히 사용하는 경우이 모든 것을 처리합니다. DateTime) - 동등한 .proto는 다음과 같습니다.

message DateTime {
  optional sint64 value = 1; // the offset (in units of the selected scale)
                             // from 1970/01/01
  optional TimeSpanScale scale = 2 [default = DAYS]; // the scale of the
                                                     // timespan
  enum TimeSpanScale {
    DAYS = 0;
    HOURS = 1;
    MINUTES = 2;
    SECONDS = 3;
    MILLISECONDS = 4;

    MINMAX = 15; // dubious
  }
}

DateTime 하루 종일 표현할 수 있습니다. 1970 년 이후 일수를 보냅니다. 작은 마커를 규모로 보냅니다. 이것은 날짜가 좀 더 효율적으로 전송 될 수 있지만 다른 척도의 경우 실제로는 더 많은 비용이 들지 않음을 의미합니다.

개인적으로 나는 사용하지 않을 것입니다 ToBinary() - 알려진 에포크 (예 : Unix Epoch)에서 알려진 척도의 오프셋을 명시 적으로 사용합니다. 이로 인해 플랫폼간에 휴대가 더 휴대가됩니다. 그러나 예를 들어 밀리 초 오프셋 만 보내는 경우 고정 스케일은 일반적으로 변형 길이 스케일보다 더 효율적입니다. 서명이 필요한지 또는 서명되지 않은지 여부에 따라 시대의 날짜가 필요한지 여부에 따라 다릅니다.

서명 된 64 비트 번호를 사용해야합니다. DateTime 부정적 일 수 있지만 ToBinary 메소드를 반환합니다 Int64, 서명 된 64 비트 번호입니다.

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