私はprotobuf-csharp-portを使用していますが、後で再生するためにいくつかのprotobufメッセージを記録する機能が必要です。XMLは私にとって理想的ですが、人間がファイルにアクセスして変更を加え、ファイルからメッセージを再生できる限り、柔軟性があります。
この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();
}
}
1つだけMyRequest
が逆シリアル化され、他の2つは無視されます。(reqFromFile
ビルド後、input.IsAtEnd == true
。)
さて、私の質問に戻りましょう。ファイルから複数の人間が読める形式のprotobufメッセージを読み取る方法はありますか?