0

私はこの Java コード ( source ) を持っています:

// Deserialize
Person person = new Person();
InputStream in;
XmlIOUtil.mergeFrom(in, person, Person.getSchema());

// Do stuff...

// Serialize back into XML
OutputStream out;
XmlIOUtil.writeTo(out, person, Person.getSchema());

XML コードに、スキーマにない不明なフィールドが含まれているとします (つまり、提供された XML は新しいバージョンのソフトウェアによって生成されます)。

これらのフィールドを再度シリアル化するときに、これらのフィールドを保持するためのきれいな方法はありますか? Protocol Buffers が不明なフィールドを保持していることは知っています。

1 つの解決策は、元の XML をバッファーにコピーしてから、新しくシリアル化された XML を元の XML とマージすることですが、これは非常に複雑に思えます。

4

2 に答える 2

0

以下は、protoc コンパイラからの出力例のスニペットです。

void hello_message::SerializeWithCachedSizes(
    ::google::protobuf::io::CodedOutputStream* output) const {
  // @@protoc_insertion_point(serialize_start:trustportal.crypt.rpc.hello_message)
  // required string welcome_message = 1;
  if (has_welcome_message()) {
    ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField(
      this->welcome_message().data(), this->welcome_message().length(),
      ::google::protobuf::internal::WireFormat::SERIALIZE,
      "welcome_message");
    ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased(
      1, this->welcome_message(), output);
  }

  if (!unknown_fields().empty()) {
    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
        unknown_fields(), output);
  }
  // @@protoc_insertion_point(serialize_end:trustportal.crypt.rpc.hello_message)
}

未知のフィールドが正しくシリアライズされることを暗示しているようです。

于 2014-10-25T09:46:19.500 に答える
0

Protostuff フォーラムの投稿によると、不明なフィールドの保持はサポートされていないようです:

Protobuf シリアライゼーション (Protostuff の一部) は、Google が提供するライブラリが行うことなら何でも処理できると思います。Protostuff の使用を選択した場合、拡張子や不明なフィールドは利用できますか?

いいえ、いいえ。不明なフィールドは無視されます。

于 2014-10-22T07:43:00.297 に答える