2012-09-12 16 views
1

我正在使用protobuf-csharp-port,並且需要記錄稍後重播的一些protobuf消息的功能。 XML對我來說是理想的,但只要人能夠進入文件,進行更改,然後重播文件中的消息,我就很靈活。使用帶有protobuf-csharp端口的文件記錄並重放可讀的protobuf消息

使用此C#代碼:

 MyRequest req = 
      MyRequest.CreateBuilder().SetStr("Lafayette").Build(); 

     using (var stringWriter = new StringWriter()) 
     { 
      var xmlWriterSettings = new XmlWriterSettings 
       { 
        ConformanceLevel = ConformanceLevel.Fragment 
       }; 

      var xmlWriter = XmlWriter.Create(stringWriter, xmlWriterSettings); 

      ICodedOutputStream output = XmlFormatWriter.CreateInstance(xmlWriter); 
      req.WriteTo(output); 
      output.Flush(); 
      string xml = stringWriter.ToString(); 

      using (var streamWriter = new StreamWriter(@"Requests.txt")) 
      { 
       streamWriter.WriteLine(xml); 
       streamWriter.WriteLine(xml); 
       streamWriter.WriteLine(xml); 
      } 
     } 

我產生含有Requests.txt文件:

<str>Lafayette</str> 
<str>Lafayette</str> 
<str>Lafayette</str> 

然而,當我嘗試將其反序列化回用:

 var xmlReaderSettings = new XmlReaderSettings 
     { 
      ConformanceLevel = ConformanceLevel.Fragment 
     }; 

     using (var xmlReader = XmlReader.Create(@"Requests.txt", xmlReaderSettings)) 
     { 
      ICodedInputStream input = XmlFormatReader.CreateInstance(xmlReader); 
      MyRequest reqFromFile; 

      while(!input.IsAtEnd) 
      { 
       reqFromFile = 
        ReverseRequest.CreateBuilder().MergeFrom(input).Build(); 
      } 
     } 

只有一個MyRequest被反序列化,另外兩個被忽略。 (後reqFromFile建成,input.IsAtEnd == true。)

所以,回到我的問題:是有一些方法可以從文件中讀取多個人類可讀的protobuf的消息?

回答

1

所以回到我的問題:有沒有辦法從文件中讀取多個人類可讀的protobuf消息?

那麼你目前正在創建一個帶有多個根元素的文本文件 - 它不是一個有效的XML文件。

最簡單的方法可能是創建一個包含所有請求的單個XML文檔,然後加載它(例如使用LINQ to XML)並在每個根元素的子元素上創建一個XmlReader。這些XmlReader對象中的每一個都應該能夠然後反序列化爲單個protobuf消息。

0

你可以看看Protocol buffer Editor

或者有谷歌自己的文本格式,它有點像JSON。您可以使用protoc命令在2之間進行轉換(看看編碼/解碼選項,您還需要原始定義)

+0

有趣。如果我們使用Java,我會試圖更仔細地看。 – OmniJeff