何が最良の方法を表します。小数プロトコルバッファ?
-
21-08-2019 - |
質問
続き この 問いうことを表す。小数点オブジェクトのプロトコルをバッファ?
解決
まあ、いるProtobuf-netは、単にあなたのためにこれを処理します。それは型のプロパティをオフ動作し、decimal
を完全にサポートしています。プロトでdecimal
を表現する直接的な方法はありませんので、それは(現時点では)「.proto」ファイルからdecimal
プロパティを生成しませんが、いくつかの共通のタイプ( 『BCL.Decimal』を認識するための素敵な微調整だろうか似ている)と、小数点として解釈ます。
は、それを表現するためとして - 私はこの上でディスカッション文書を持っていましたいるProtobufネットウィキエリアに(今時代遅れの私は疑います)。単にあなたのためにそれを行いいるProtobufネットでの作業バージョンは今あります。
ジョンと私はもっと後でこれを打ち出すだろう間違いなく今日;-p
(.proto中)こののいるProtobuf-netのバージョン<のhref = "http://code.google.com/p/protobuf-net/source/browse/trunk/Tools/bclから(のようなものです.proto」のrel = "noreferrer">ここの):
message Decimal {
optional uint64 lo = 1; // the first 64 bits of the underlying value
optional uint32 hi = 2; // the last 32 bis of the underlying value
optional sint32 signScale = 3; // the number of decimal digits, and the sign
}
他のヒント
マークと私はあなたに利用可能な変換で、一般的な方法で(心に瞬時に湧き日付/時間と10進数)かなり一般的なタイプを表すことができるような「共通PBメッセージ」ライブラリを思い付くために非常に漠然とした計画を持っています。 NETとJava(と何も誰にも貢献したい)。
あなたは.NETに固執する満足している、とあなたはコンパクトを探しているなら、私はおそらくのようなものでいいと思う。
message Decimal {
// 96-bit mantissa broken into two chunks
optional uint64 mantissa_msb = 1;
optional uint32 mantissa_lsb = 2;
required sint32 exponent_and_sign = 3;
}
の符号は、単に指数は、絶対値であると、exponent_and_signの符号で表すことができる。
仮数の両方の部分は、オプションの作成0 非常にのコンパクト(まだ0メートルと0.0000メートルなどの区別)で表されることを意味します。 exponent_and_signは、同様に私たちが本当に望んでいた場合は、オプションの可能性があります。
あなたはパーシャルクラスにSystem.DecimalのとProtobuf.Common.Decimal(または何でも)との間の変換を置くことができますので、私はマルクのプロジェクトのことは知らないが、私のポートに私は部分クラスを生成します。
私たちはパッチprotobuf-索したい単語をポートフックを生成するprotobufクラスを母数としたDateTimeが構造体.ワイヤー形式的には、で表される二つの"内蔵型"のプロトメッセージ
ず実施アプローチよりジョンやマークのピークカットとして4 sint32
価値観、便利マップtriviallyへの出力 類ではありません。GetBits().
のプロトファイルのような感じになります:
message ProtoDecimal {
sint32 v1 = 1;
sint32 v2 = 2;
sint32 v3 = 3;
sint32 v4 = 4;
}
のコンバータ:
public decimal ConvertToDecimal(AbideDecimal value)
{
return new decimal(new int[] { value.V1, value.V2, value.V3, value.V4 });
}
public ProtoDecimal ConvertFromDecimal(decimal value)
{
var bits = decimal.GetBits(value);
return new ProtoDecimal
{
V1 = bits[0],
V2 = bits[1],
V3 = bits[2],
V4 = bits[3]
}
}
このような簡単、その他の言語だけを対象にC#で取り上げたいのは、同じ最大16バイトのその他のアプローチは値0なしにコンパクトに収納され-かについて十分に複雑な方法の詳細はprotobuf店int)をより鮮明に見せなければならないためのダンダムプログラマのようにした)
明らかにする レースの馬 また性能試験が間違いあります。