Kann ich serialisieren beliebiger Typen mit protobuf-net?
Ich versuche zu serialisieren einige Objekte mit protobuf-net, aber leider machen Sie ausgiebig Gebrauch von DateTimeOffset
, die noch nicht unterstützt wird von protobuf-net. Dies führt zu viel:
Kein serializer definiert für Typ: System.DateTimeOffset
Kann ich definieren, meine eigene Serialisierung routine für unbekannte Typen? (Die gleiche Frage wurde gefragt früher, aber sein problem wurde gelöst.)
Ich bin mit der neuesten protobuf-net beta, v2.0.0.431, unter .NET 4 wenn es darauf ankommt. Ich bin auch mit runtime-Definitionen, so habe ich keine Möglichkeit, deklarativ festlegen, wie bestimmte Eigenschaften behandelt werden.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es zwei Wege der Annäherung an das Problem der unbekannten "gängigen" Arten; die erste ist die Verwendung eines shim-Eigenschaft, zum Beispiel einer Immobilie, die den Wert repräsentiert, als etwas ähnliches (ein
string
oderlong
zum Beispiel):Der andere Ansatz ist ein Surrogat, die eine zweite protobuf Vertrag wird automatisch ersetzt. Die Voraussetzungen für ein Surrogat sind:
DateTimeOffset
undDateTimeOffsetSurrogate
)SetSurrogate(surrogateType)
zu erziehen protobuf-net, zum BeispielRuntimeTypeModel.Default.Add(typeof(DateTimeOffset), false).SetSurrogate(typeof(DateTimeOffsetSurrogate));
den shim-Eigenschaft ist einfacher, erfordert aber wiederholen Sie pro-Mitglied. Das Surrogat angewendet wird, automatisch auf alle Instanzen des Typs innerhalb des Modells. Die Leihmutter dann folgt die standard-protobuf-net Regeln, so würden Sie angeben, welche Mitglieder serialisiert werden, etc.
EDIT: das Hinzufügen von code-Beispiel
Dann zu registrieren, wie dies
value.ToString("o")
, nicht"u"
. Sonst verlieren Sie die offset-Informationen (Zeitzone).Mit allem Respekt für Marc Gravell ' s Antwort, wenn Sie sich sorgen über die Größe der serialisierten Daten verwenden, sollten Sie die folgenden Surrogat-Klasse. Die Ausgabe-Größe ist 21 Byte anstelle von 35 bytes.
Und registrieren Sie es anschließend absolut die gleiche Weise:
Nur im Falle eines F# - Entwickler in dieser Frage, hier ist eine Antwort in F#:
Es ist die
op_Implicit
Aspekt, das nicht-offensichtliche.Könnte man auch anpassen, diese zu verwenden, Max die Technik der Verwendung von Zecken, um Platz zu sparen.
Edit: Hier ist, wie Sie die Stellvertreter der run-time-type-Modell-Ding: