如何在Java中比较两个proto缓冲区消息?

时间:2015-05-25 07:24:31

标签: java protocol-buffers

com.google.protobuf包中,我找到了Message界面,声称它将按内容进行比较:

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);

但是我写了测试代码:

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());        
  }
}

它提供了false

那么,如何与proto缓冲区消息进行比较?

2 个答案:

答案 0 :(得分:9)

==比较对象引用,它检查两个操作数是否指向同一个对象不是等效对象,同一个对象 ),因此您可以确保 .build()每次都创建一个新对象 ......

要使用您发布的代码,您必须与equals

进行比较
System.out.println(aBuilder.build().equals(aBuilder.build()));        

答案 1 :(得分:3)

在Java中,您需要使用equals方法比较对象,而不是使用==运算符。问题是==比较它是否是同一个对象,而equals方法比较它们是否与类的开发者提供的实现相等。

System.out.println(aBuilder.build().equals(aBuilder.build()));

有关详情,有很多问题已经存在(例如Java == vs equals() confusion