2011-10-10 90 views
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); 
     } 
    } 
} 
+0

对不起,我昨天错过了这个。我离开了我的电脑,但是我将在稍后回来时准备回答。 –

+0

等待您的回复。保重! – Scooletz

+0

嗯,是的,这是一个愚蠢的;有repro - 看着它;它是一个IL发出错误(堆栈下溢),所以测试没有任何问题(除了它不会将'.SomeField'添加到'SomeEvent'的'MetaType') –

回答

0

非常简单;图书馆已经(有)一个bug,发射

initobj {type} 
stloc.0 

明显(咳嗽)为价值型Descriptor它应该被发射

ldloca.s 0 
initobj {type} 

我会得到这个尽快部署正如我检查过的,我并没有破坏任何东西。