C# 尝试读取超过流末尾时,没有无参数构造函数异常

C# 尝试读取超过流末尾时,没有无参数构造函数异常,c#,protobuf-net,C#,Protobuf Net,在过去的几个小时里,我一直在努力解决“没有为[type]找到无参数构造函数”这一异常。现在,我创建了一个简单的单元测试,它应该反映我在应用程序中得到的内容,并且当我不执行stream.Position=0时,似乎会引发此异常 此外,在任何情况下,当对象只是一个标准类(不是从抽象类派生的)时,我都不会遇到这种异常 请参阅下面的代码: 按原样运行-它会中断,说找不到基的构造函数 取消对stream.Position的注释=0,这样就可以了 再次注释该行,将派生类更改为not inherit from

在过去的几个小时里,我一直在努力解决“没有为[type]找到无参数构造函数”这一异常。现在,我创建了一个简单的单元测试,它应该反映我在应用程序中得到的内容,并且当我不执行
stream.Position=0
时,似乎会引发此异常

此外,在任何情况下,当对象只是一个标准类(不是从抽象类派生的)时,我都不会遇到这种异常

请参阅下面的代码:

  • 按原样运行-它会中断,说找不到基的构造函数

  • 取消对stream.Position的注释=0,这样就可以了

  • 再次注释该行,将派生类更改为not inherit from Base,并取消对类中唯一属性的注释,运行它-它不会中断(但名称显然将为null)

  • 有人能解释一下为什么会这样吗?为什么#1抛出(或者为什么#3不抛出)以及为什么会出现此消息

    [Test]
    public void CanSerialize_Derived()
    {
        var derived = new Derived() {Name = "ngf"};
        var stream = new MemoryStream();
        Serializer.Serialize(stream, derived);
        //stream.Position = 0;
        var deserializedInstance = Serializer.Deserialize<Derived>(stream);
    }
    
    [ProtoContract]
    [ProtoInclude(9, typeof(Derived))]
    public abstract class Base 
    {
        [ProtoMember(1)]
        public string Name { get; set; }
    }
    
    [ProtoContract]
    public class Derived : Base
    {
        //[ProtoMember(1)]
        //public string Name { get; set; }
    }
    
    [测试]
    public void CanSerialize_-Derived()
    {
    var-derived=new-derived(){Name=“ngf”};
    var stream=newmemoryStream();
    Serializer.Serialize(流,派生);
    //流位置=0;
    var deserializedInstance=Serializer.Deserialize(流);
    }
    [原始合同]
    [ProtoInclude(9,typeof(派生))]
    公共抽象类基
    {
    [原成员(1)]
    公共字符串名称{get;set;}
    }
    [原始合同]
    派生的公共类:基
    {
    //[原成员(1)]
    //公共字符串名称{get;set;}
    }
    
    长度为零的流在protobuf网络中有效;在protobuf net中,所有序列化都从该DTO继承树的根类型开始,因此它将从
    Base
    -开始,直到它同意数据实际上包含
    派生的
    ,它才会相信您,并将尝试使用
    Base
    。这就是为什么#1投

    显然,如果您将流保留在末尾,则可反序列化的数据长度为零。这就是为什么#2次通过

    如果删除继承,则该继承树的根是派生的
    ;这是一个根本性的突破性变化,但继承方面的区别在于它不再试图在没有任何信息的情况下反序列化
    抽象类型。这就是为什么#3修复了它(出于不好的原因)


    这里的关键是继承是作为信息实现的。除非有信息,否则它唯一假定的是对象的类型是继承树的根。

    感谢您的解释-这种行为现在确实更有意义了。