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?

War es hilfreich?

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
scroll top