1

私は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メッセージを読み取る方法はありますか?

4

2 に答える 2

1

さて、私の質問に戻りましょう。ファイルから複数の人間が読める形式のprotobufメッセージを読み取る方法はありますか?

現在、複数のルート要素を含む単一のテキストファイルを作成しています。これは有効なXMLファイルではありません。

最も簡単なアプローチは、おそらく、これらすべての要求を含む単一のXMLドキュメントを作成し、それをロードして(たとえば、LINQ to XMLを使用して)XmlReader、ルート要素の各子に配置を作成することです。これらの各XmlReaderオブジェクトは、単一のprotobufメッセージに逆シリアル化できる必要があります。

于 2012-09-12T22:38:00.770 に答える
0

あなたはプロトコルバッファエディタを見ることができます

または、JSonに少し似たGoogle独自のテキスト形式があります。protocコマンドを使用して2つを変換できます(encode / decodeオプションを見てください。proto定義も必要です)

于 2012-09-13T07:51:57.403 に答える