'No parameterless constructor found for [type]'在过去的几个小时里,我一直在努力解决这个问题.现在我创建了一个简单的单元测试,它应该反映我在应用程序中得到的内容,而且当我不这样做时,似乎抛出了这个异常stream.Position = 0.
此外,在任何情况下,当对象只是一个标准类(不是从抽象类派生)时,我都不会得到这个异常.
请参阅以下代码:
按原样运行 - 它会破坏说没有为Base找到构造函数
取消注释stream.Position = 0,它会没事的
再次注释该行,将Derived类更改为不从Base继承并取消注释类中的唯一属性,运行它 - 它不会中断(但显然Name将为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; }
}
Run Code Online (Sandbox Code Playgroud)
长度为零的流在protobuf-net中有效; 在protobuf网所有序列开始于根类型的DTO继承树的,所以它会开始在Base-直到它可以同意该数据实际上包含一个Derived,也不会相信你-并会尝试一起工作Base.这就是#1抛出的原因.
显然,如果将流保留在末尾,则可用于反序列化的数据长度为零.这就是#2通过的原因.
如果删除继承,那么继承树的根是Derived; 这是一个根本性的突破性变化,但继承方面的差异在于它不再尝试在abstract没有任何信息的情况下反序列化类型.所以这就是为什么#3修复它(出于不好的原因).
这里的关键点是继承是作为信息实现的.除非有信息,否则它唯一假定的是对象属于继承树根的类型.
| 归档时间: |
|
| 查看次数: |
2035 次 |
| 最近记录: |