Die Deserialisierung fällt nach dem Umschalten des Präfixstyle auf fest32 fehl.
-
16-09-2019 - |
Frage
Ich habe eine Testsuite für eine Kommunikationsbibliothek, die ich verwende protobuf-net
Das läuft in Ordnung. Alle Tests bestehen. Wenn ich jedoch das Präfixstil von Base128 auf fest 32 ändere, fällt die Deserialisierung aus.
Die Ausnahme, die ich von der erhalte TryDeserializeWithLengthPrefix
Funktion ist:
System.ArgumentNullException was caught
Message="Value cannot be null.\r\nParameter name: type"
Source="protobuf-net"
ParamName="type"
Alles funktioniert einfach, wenn ich einfach das Präfixstyle.Base128 bei der Serialisierung und Deserialisierung der Nachricht behalte.
Weiß jemand, was möglicherweise passiert?
Lösung
Hohum, yup sieht aus wie ein Fehler (Jetzt protokolliert); Wiederholbares Beispiel unten. Ich werde sehen, ob ich es (in Kürze) im Zug reparieren kann. Entschuldigen Sie:
using System;
using System.IO;
using ProtoBuf;
[ProtoContract]
public class Strange // test entity
{
[ProtoMember(1)]
public string Foo { get; set; } // test prop
[ProtoMember(2)]
public int Bar { get; set; } // test prop
static void Main() {
var original = new Strange { Foo = "abc", Bar = 123 };
// serialize and deserialize with base-128
using (MemoryStream ms = new MemoryStream()) {
Serializer.SerializeWithLengthPrefix(ms, original, PrefixStyle.Base128,1);
ms.Position = 0;
object obj;
Serializer.NonGeneric.TryDeserializeWithLengthPrefix(ms,
PrefixStyle.Base128, i => typeof(Strange),out obj);
var clone = (Strange)obj;
Console.WriteLine("Foo via Base128: " + clone.Foo); // works fine
Console.WriteLine("Bar via Base128: " + clone.Bar);
}
// serialize and deserialize with fixed-32
using (MemoryStream ms = new MemoryStream())
{
Serializer.SerializeWithLengthPrefix(ms, original, PrefixStyle.Fixed32,1);
ms.Position = 0;
object obj;
// BOOM here; oh how embarrassing
Serializer.NonGeneric.TryDeserializeWithLengthPrefix(ms,
PrefixStyle.Fixed32, i => typeof(Strange), out obj);
var clone = (Strange)obj;
Console.WriteLine("Foo via Fixed32: " + clone.Foo);
Console.WriteLine("Bar via Fixed32: " + clone.Bar);
}
}
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow