Я использую protobuf-csharp-port, и мне нужна возможность записывать некоторые сообщения protobuf для последующего воспроизведения. XML был бы идеальным для меня, но я гибок, пока человек может войти в файл, внести изменения, а затем воспроизвести сообщения из файла.
Используя этот код С#:
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 из файла?