سؤال

لدي مجموعة اختبار لمكتبة اتصال سأتطور باستخدام protobuf-net هذا يعمل بخير. جميع الاختبارات تمر. ولكن إذا قمت بتغيير البادئة من Base128 إلى Difference32، فشل التحجيم.

الاستثناء الذي أتلقى منه من TryDeserializeWithLengthPrefix وظيفة هي:


System.ArgumentNullException was caught
  Message="Value cannot be null.\r\nParameter name: type"
  Source="protobuf-net"
  ParamName="type"

كل شيء يعمل فقط إذا كنت أبقي البادئة .base128 عند تسلسل الرسالة وتغاضيها.

هل يعرف أحد ما قد يحدث؟

هل كانت مفيدة؟

المحلول

hohum، نعم يشبه الخلل (تسجيل الدخول الآن) مثال متكرر أدناه. سأرى إذا كان بإمكاني إصلاحه في القطار (قريبا). آسف "نوبة"

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);
        }
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top