为什么以下简单的 C# 代码会引发有关缺少默认构造函数的 ProtoException? [英] Why does the following trivial C# code raise a ProtoException about a missing default constructor?

查看:41
本文介绍了为什么以下简单的 C# 代码会引发有关缺少默认构造函数的 ProtoException?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

代码如下:

using System.Diagnostics;
using System.IO;
using ProtoBuf;

namespace ProtoBufTest
{
    [ProtoContract]
    [ProtoInclude(13, typeof(BuildEvent))]
    public abstract class Event
    {
        [ProtoMember(1)]
        public int NodeId { get; set; }
    }

    [ProtoContract]
    public class BuildEvent : Event
    {
    }

    public class Program
    {
        static void Main(string[] args)
        {
            var ms = new MemoryStream();
            Serializer.SerializeWithLengthPrefix<object>(ms, new BuildEvent(), PrefixStyle.Base128);

            Debug.WriteLine(ms.Position);
            ms.Position = 0;

            var ev = Serializer.DeserializeWithLengthPrefix<BuildEvent>(ms, PrefixStyle.Base128);
            Debug.WriteLine(ev.ToString());
        }
    }
}

我使用的是 protobuf-net 2.4.0.运行此代码会引发以下异常:

I am using protobuf-net 2.4.0. Running this code raises the following exception:

Unhandled Exception: ProtoBuf.ProtoException: No parameterless constructor found for ProtoBufTest.Event
   at ProtoBuf.Meta.TypeModel.ThrowCannotCreateInstance(Type type)
   at proto_4(Object , ProtoReader )
   at ProtoBuf.Serializers.CompiledSerializer.ProtoBuf.Serializers.IProtoSerializer.Read(Object value, ProtoReader source)
   at ProtoBuf.Meta.RuntimeTypeModel.Deserialize(Int32 key, Object value, ProtoReader source)
   at ProtoBuf.Meta.TypeModel.DeserializeWithLengthPrefix(Stream source, Object value, Type type, PrefixStyle style, Int32 expectedField, TypeResolver resolver, Int64& bytesRead, Boolean& haveObject, SerializationContext context)
   at ProtoBuf.Serializer.DeserializeWithLengthPrefix[T](Stream source, PrefixStyle style, Int32 fieldNumber)
   at ProtoBuf.Serializer.DeserializeWithLengthPrefix[T](Stream source, PrefixStyle style)
   at ProtoBufTest.Program.Main(String[] args) in C:\Work\ProtoBufTest\ProtoBufTest\Program.cs:line 30

推荐答案

这里使用是不对的;这就是说我知道类型 - 类型是 object".如果你没有通用友好的场景,你应该使用非通用 API - 请参阅 Serializer.NonGeneric.* 或使用 RuntimeTypeModel.Default.*;这将通过对象获得Type.

The use of <object> here is incorrect; that's saying "I know the type - the type is object". If you don't have a generic-friendly scenario, you should use the non-generic API - see Serializer.NonGeneric.* or use RuntimeTypeModel.Default.*; this will then obtain the Type via the object.

我会考虑是否应该让 自动切换到非泛型模式.

I will think about whether we should make <object> automatically switch into non-generic mode.

这篇关于为什么以下简单的 C# 代码会引发有关缺少默认构造函数的 ProtoException?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆