Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to compare two proto buffer message in Java?

In package com.google.protobuf I found a Message interface, it claims it will compare by content:

public interface Message extends MessageLite, MessageOrBuilder {
  // -----------------------------------------------------------------
  // Comparison and hashing

  /**
   * Compares the specified object with this message for equality.  Returns
   * <tt>true</tt> if the given object is a message of the same type (as
   * defined by {@code getDescriptorForType()}) and has identical values for
   * all of its fields.  Subclasses must implement this; inheriting
   * {@code Object.equals()} is incorrect.
   *
   * @param other object to be compared for equality with this message
   * @return <tt>true</tt> if the specified object is equal to this message
   */
  @Override
  boolean equals(Object other);

But I write test code:

public class Test {
  public static void main(String args[]) {
    UserMidMessage.UserMid.Builder aBuilder = UserMidMessage.UserMid.newBuilder();
    aBuilder.setQuery("aaa");
    aBuilder.setCateId("bbb");
    aBuilder.setType(UserMidMessage.Type.BROWSE);
    System.out.println(aBuilder.build() == aBuilder.build());        
  }
}

It gives false.

So, how to compare to proto buffer message?

like image 873
Sayakiss Avatar asked May 25 '15 07:05

Sayakiss


People also ask

Does Protobuf have inheritance?

Protobuf doesn't support inheritance. Having a common header and using composition is the best solution. You received this message because you are subscribed to the Google Groups "Protocol Buffers" group.

Is Protobuf text or binary?

Protobuf is a binary format, so reading and writing should be done as binary, not text. If you don't want binary format, you should consider using something other than protobuf (there are lots of textual data formats, such as XML, JSON, CSV); just using text abstractions is not enough.

What is oneof in Protobuf?

Protocol Buffer (Protobuf) provides two simpler options for dealing with values that might be of more than one type. The Any type can represent any known Protobuf message type. And you can use the oneof keyword to specify that only one of a range of fields can be set in any message.

Is Protobuf better than JSON?

JSON is usually easier to debug (the serialized format is human-readable) and easier to work with (no need to define message types, compile them, install additional libraries, etc.). Protobuf, on the other hand, usually compresses data better and has built-in protocol documentation via the schema.


1 Answers

== compares object references, it checks to see if the two operands point to the same object (not equivalent objects, the same object), so you can be sure that .build() makes a new object each time...

To use the code you posted you must compare with equals

System.out.println(aBuilder.build().equals(aBuilder.build()));        
like image 96
Jordi Castilla Avatar answered Nov 17 '22 20:11

Jordi Castilla