0

我有这个 Java 代码(源代码):

// 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 是由较新版本的软件生成的)。

当我再次序列化它们时,是否有一种很好、干净的方法来保留这些字段?我知道协议缓冲区保留未知字段

一种解决方案是将原始 XML 复制到缓冲区中,然后将新序列化的 XML 与原始 XML 合并,但这似乎过于复杂。

4

2 回答 2

0

根据Protostuff 论坛上的帖子,似乎不支持保留未知字段:

我假设 Protobuf 序列化(它是 Protostuff 的一部分)能够处理 Google 提供的库所做的任何事情。如果我选择使用 Protostuff,扩展和未知字段是否可用?

没有也没有。未知字段将被忽略。

于 2014-10-22T07:43:00.297 回答
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 回答