1
我想使用不带属性的protocolbuf .net版本,并使用通过特定代码创建的RuntimeTypeModel。在我遇到这种情况之前它工作得很好,这在下面的案例中被提取。引用的protobuf-net库的版本是2.0.0.447。这个模型的创建有什么问题?任何线索?创建RuntimeTypeModel在反序列化复合对象期间失败
public class ProtoBufFailingTest
{
public abstract class Message
{
}
public class SomeMessage : Message
{
public readonly Descriptor Desc;
public SomeMessage(Descriptor desc)
{
Desc = desc;
}
}
public struct Descriptor
{
public readonly Event EventData;
public Descriptor(Event eventData)
{
EventData = eventData;
}
}
public abstract class Event
{
}
public class SomeEvent : Event
{
public int SomeField;
}
[Test]
public void FailingTest()
{
var model = TypeModel.Create();
// message hierarchy
{
var messages = model.Add(typeof(Message), true);
messages.AddSubType(1, typeof(SomeMessage));
model[typeof(SomeMessage)].UseConstructor = false;
}
// events hierarchy
{
var events = model.Add(typeof (Event), true);
events.AddSubType(1, typeof (SomeEvent));
model[typeof (SomeEvent)].UseConstructor = false;
}
// descriptor
var eventDescriptorModel = model.Add(typeof(Descriptor), true);
eventDescriptorModel.UseConstructor = false;
var typeModel = model.Compile();
const PrefixStyle prefixStyle = PrefixStyle.Base128;
const int testValue = 5;
using (var ms = new MemoryStream())
{
typeModel.SerializeWithLengthPrefix(ms, new SomeMessage(new Descriptor(new SomeEvent { SomeField = testValue })), null, prefixStyle, 0);
ms.Seek(0, SeekOrigin.Begin);
// fails here
var message = (SomeMessage)typeModel.DeserializeWithLengthPrefix(ms, null, typeof(Message), prefixStyle, 0);
Assert.AreEqual(testValue, ((SomeEvent)message.Desc.EventData).SomeField);
}
}
}
对不起,我昨天错过了这个。我离开了我的电脑,但是我将在稍后回来时准备回答。 –
等待您的回复。保重! – Scooletz
嗯,是的,这是一个愚蠢的;有repro - 看着它;它是一个IL发出错误(堆栈下溢),所以测试没有任何问题(除了它不会将'.SomeField'添加到'SomeEvent'的'MetaType') –