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') –