Frage

dieser Frage was wäre der beste Weg sein, ein System.Decimal Objekt in einem Protokollpuffer zu vertreten?

War es hilfreich?

Lösung

Nun, protobuf-net einfach handhaben dies für Sie; es läuft die Eigenschaften von Arten ab und volle Unterstützung für decimal hat. Da es auszudrücken decimal in Proto keine direkte Möglichkeit ist, wird es nicht (derzeit) eine decimal Eigenschaft von einer „Proto“ Datei zu erzeugen, aber es wäre ein schönes zwicken sein, einige allgemeine Art ( ‚BCL.Decimal‘ zu erkennen oder ähnlich) und es als Dezimalzahl interpretiert werden.

Wie für die Darstellung - ich hatte ein Diskussion Dokument auf diesem (jetzt veraltet vermute ich) in dem protobuf-net wiki-Bereich; gibt es jetzt eine Arbeitsversion in protobuf-Netz, das macht es einfach für Sie.

Kein Zweifel, Jon und ich werde diese hämmern mehr später heute ;-p

Die protobuf-net-Version dieses (in .proto) ist so etwas wie (von hier ):

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
}

Andere Tipps

Marc und ich habe sehr vagee Pläne mit einer „gemeinsamer PB Meldung“ Bibliothek zu kommen, so dass Sie ziemlich gängige Typen darstellen können (Datum / Uhrzeit und dezimal sofort in dem Sinne sprießt) in einer gemeinsamen Art und Weise, mit Umwandlungen in. NET und Java (und alles, was jemand will beitragen).

Wenn Sie glücklich sind zu .NET zu halten, und Sie suchen Kompaktheit, ich vielleicht mit etwas gehen würde wie:

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

Das Zeichen kann nur durch das Vorzeichen von exponent_and_sign dargestellt werden, wobei der Exponent der absolute Wert zu sein.

beiden Teile der Mantisse zu machen optional bedeutet, dass 0 dargestellt wird sehr kompakt (aber immer noch zwischen 0m Differenzierung und 0.0000m usw.). exponent_and_sign könnte auch optional sein, wenn wir wirklich wollen.

Ich weiß nicht, über Marcs Projekt, aber in meinem Hafen I erzeugen partielle Klassen, so können Sie die eine Umwandlung zwischen System.Decimal und Protobuf.Common.Decimal setzen (oder was auch immer) in die Teilklasse.

Ich habe eine Patch für protobuf-csharp-Port mit Haken, die protobuf Klassen mit einheimischer Dezimal und Datetime structs erzeugt. Draht-Format weise, sie werden dargestellt durch zwei „eingebaute“ proto-Nachrichten.

Hier ist der Link: https://code.google.com/p/protobuf-csharp-port/issues/detail?can=2&start=0&num=100&q=&colspec=ID%20Type%20Status % 20Priority% 20Milestone% 20Owner% 20Summary & groupby = & sort = & id = 78

Ein etwas einfacher zu implementieren Ansatz als Jon oder Marcs ist es zu speichern, wie 4 sint32 Werte, die bequem triviale Karten mit dem Ausgang Decimal.GetBits () .

Die Proto-Datei wird wie folgt aussehen:

message ProtoDecimal {
    sint32 v1 = 1;
    sint32 v2 = 2;
    sint32 v3 = 3;
    sint32 v4 = 4;
}

Und der Konverter wird sein:

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]
    }
}

Dies könnte nicht so einfach sein, in anderen Sprachen, aber wenn man nur C # Ziel haben, dann wird es die gleiche maximal 16 Bytes, die der andere Ansatz (obwohl Werte wie 0 vielleicht nicht so kompakt gespeichert werden nehmen - I nicht genug wissen über die komplizierten Details wie protobuf speichert ints), während sie viel klarer stumm-dumm-Programmierer wie mich :)

Natürlich werden Sie auf die Pferde rennen wenn Sie wollen Testleistung, aber ich bezweifle, dass es ist viel drin.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top