2011-10-10 74 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} 

我會得到這個儘快部署正如我檢查過的,我並沒有破壞任何東西。