浅谈序列化之protobuf与avro对比(Java)

最近在做socket通信中用到了关于序列化工具选型的问题,在调研过程中开始趋向于用protobuf,可以省去了编解码的过程。能够实现快速开发,且只需要维护一份协议文件即可。

但是调研过程中发现了protobuf的一些弊端,比如需要生成相应的文件类,和业务绑定太紧密,所以在看了AVRO之后发现它完美解决了这个问题。

下面记录下对这两种序列化工具的入门与测评。

一、protobuf基本操作

protobuf简介:

Protocol Buffers (a.k.a., protobuf) are Google's language-neutral, platform-neutral, extensible mechanism for serializing structured data. 

protobuf是google提供的一种跨语言、跨平台、可扩展的序列化工具。

1.1定义协议文件(部分字段)(TCPLog.proto):

syntax = "proto2";
message TCPLog{
     optional int32  total_byteps = 1;
     optional int64 flow_start_time =2;
     optional int64 date =3;
}

1.2生成对应的Java类:

生成过程可以使用ecplise 的插件 或者 直接在控制台中使用命令生成。

命令行中生成规则如下:

protoc.exe -I=proto的输入目录 --java_out=java类输出目录 proto的输入目录包括包括proto文件

生成java类如下:

// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: TCPLog.proto

public final class TCPLogOuterClass {
 private TCPLogOuterClass() {}
 public static void registerAllExtensions(
   com.google.protobuf.ExtensionRegistryLite registry) {
 }

 public static void registerAllExtensions(
   com.google.protobuf.ExtensionRegistry registry) {
  registerAllExtensions(
    (com.google.protobuf.ExtensionRegistryLite) registry);
 }
 public interface TCPLogOrBuilder extends
   // @@protoc_insertion_point(interface_extends:TCPLog)
   com.google.protobuf.MessageOrBuilder {

  /**
   * <code>optional int32 total_byteps = 1;</code>
   */
  boolean hasTotalByteps();
  /**
   * <code>optional int32 total_byteps = 1;</code>
   */
  int getTotalByteps();

  /**
   * <code>optional int64 flow_start_time = 2;</code>
   */
  boolean hasFlowStartTime();
  /**
   * <code>optional int64 flow_start_time = 2;</code>
   */
  long getFlowStartTime();

  /**
   * <code>optional int64 date = 3;</code>
   */
  boolean hasDate();
  /**
   * <code>optional int64 date = 3;</code>
   */
  long getDate();

  /**
   * <code>optional int64 server_total_packet = 4;</code>
   */
  boolean hasServerTotalPacket();
  /**
   * <code>optional int64 server_total_packet = 4;</code>
   */
  long getServerTotalPacket();

  /**
   * <code>optional int64 client_total_byte = 5;</code>
   */
  boolean hasClientTotalByte();
  /**
   * <code>optional int64 client_total_byte = 5;</code>
   */
  long getClientTotalByte();

  /**
   * <code>optional int32 link_id = 6;</code>
   */
  boolean hasLinkId();
  /**
   * <code>optional int32 link_id = 6;</code>
   */
  int getLinkId();

  /**
   * <code>optional int64 total_byte = 7;</code>
   */
  boolean hasTotalByte();
  /**
   * <code>optional int64 total_byte = 7;</code>
   */
  long getTotalByte();

  /**
   * <code>optional int64 flow_end_time = 8;</code>
   */
  boolean hasFlowEndTime();
  /**
   * <code>optional int64 flow_end_time = 8;</code>
   */
  long getFlowEndTime();

  /**
   * <code>optional int32 client_port = 9;</code>
   */
  boolean hasClientPort();
  /**
   * <code>optional int32 client_port = 9;</code>
   */
  int getClientPort();

  /**
   * <code>optional int32 protocol = 10;</code>
   */
  boolean hasProtocol();
  /**
   * <code>optional int32 protocol = 10;</code>
   */
  int getProtocol();

  /**
   * <code>optional int64 total_packet = 11;</code>
   */
  boolean hasTotalPacket();
  /**
   * <code>optional int64 total_packet = 11;</code>
   */
  long getTotalPacket();

  /**
   * <code>optional int64 flow_duration = 12;</code>
   */
  boolean hasFlowDuration();
  /**
   * <code>optional int64 flow_duration = 12;</code>
   */
  long getFlowDuration();

  /**
   * <code>optional string id = 13;</code>
   */
  boolean hasId();
  /**
   * <code>optional string id = 13;</code>
   */
  java.lang.String getId();
  /**
   * <code>optional string id = 13;</code>
   */
  com.google.protobuf.ByteString
    getIdBytes();

  /**
   * <code>optional string server_ip_addr = 14;</code>
   */
  boolean hasServerIpAddr();
  /**
   * <code>optional string server_ip_addr = 14;</code>
   */
  java.lang.String getServerIpAddr();
  /**
   * <code>optional string server_ip_addr = 14;</code>
   */
  com.google.protobuf.ByteString
    getServerIpAddrBytes();

  /**
   * <code>optional string direction_mask = 15;</code>
   */
  boolean hasDirectionMask();
  /**
   * <code>optional string direction_mask = 15;</code>
   */
  java.lang.String getDirectionMask();
  /**
   * <code>optional string direction_mask = 15;</code>
   */
  com.google.protobuf.ByteString
    getDirectionMaskBytes();

  /**
   * <code>optional int32 app = 16;</code>
   */
  boolean hasApp();
  /**
   * <code>optional int32 app = 16;</code>
   */
  int getApp();

  /**
   * <code>optional int32 client_country_id = 17;</code>
   */
  boolean hasClientCountryId();
  /**
   * <code>optional int32 client_country_id = 17;</code>
   */
  int getClientCountryId();

  /**
   * <code>optional int32 client_netsegment_id = 18;</code>
   */
  boolean hasClientNetsegmentId();
  /**
   * <code>optional int32 client_netsegment_id = 18;</code>
   */
  int getClientNetsegmentId();

  /**
   * <code>optional int64 client_total_packet = 19;</code>
   */
  boolean hasClientTotalPacket();
  /**
   * <code>optional int64 client_total_packet = 19;</code>
   */
  long getClientTotalPacket();

  /**
   * <code>optional string client_ip_addr = 20;</code>
   */
  boolean hasClientIpAddr();
  /**
   * <code>optional string client_ip_addr = 20;</code>
   */
  java.lang.String getClientIpAddr();
  /**
   * <code>optional string client_ip_addr = 20;</code>
   */
  com.google.protobuf.ByteString
    getClientIpAddrBytes();

  /**
   * <code>optional int32 tcp_status = 21;</code>
   */
  boolean hasTcpStatus();
  /**
   * <code>optional int32 tcp_status = 21;</code>
   */
  int getTcpStatus();

  /**
   * <code>optional int32 server_country_id = 22;</code>
   */
  boolean hasServerCountryId();
  /**
   * <code>optional int32 server_country_id = 22;</code>
   */
  int getServerCountryId();

  /**
   * <code>optional int32 server_netsegment_id = 23;</code>
   */
  boolean hasServerNetsegmentId();
  /**
   * <code>optional int32 server_netsegment_id = 23;</code>
   */
  int getServerNetsegmentId();

  /**
   * <code>optional int64 avg_pkt_size = 24;</code>
   */
  boolean hasAvgPktSize();
  /**
   * <code>optional int64 avg_pkt_size = 24;</code>
   */
  long getAvgPktSize();

  /**
   * <code>optional int32 server_port = 25;</code>
   */
  boolean hasServerPort();
  /**
   * <code>optional int32 server_port = 25;</code>
   */
  int getServerPort();

  /**
   * <code>optional int64 server_total_byte = 26;</code>
   */
  boolean hasServerTotalByte();
  /**
   * <code>optional int64 server_total_byte = 26;</code>
   */
  long getServerTotalByte();

  /**
   * <code>optional int32 total_packetps = 27;</code>
   */
  boolean hasTotalPacketps();
  /**
   * <code>optional int32 total_packetps = 27;</code>
   */
  int getTotalPacketps();
 }
 /**
  * Protobuf type {@code TCPLog}
  */
 public static final class TCPLog extends
   com.google.protobuf.GeneratedMessageV3 implements
   // @@protoc_insertion_point(message_implements:TCPLog)
   TCPLogOrBuilder {
  // Use TCPLog.newBuilder() to construct.
  private TCPLog(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
   super(builder);
  }
  private TCPLog() {
   totalByteps_ = 0;
   flowStartTime_ = 0L;
   date_ = 0L;
   serverTotalPacket_ = 0L;
   clientTotalByte_ = 0L;
   linkId_ = 0;
   totalByte_ = 0L;
   flowEndTime_ = 0L;
   clientPort_ = 0;
   protocol_ = 0;
   totalPacket_ = 0L;
   flowDuration_ = 0L;
   id_ = "";
   serverIpAddr_ = "";
   directionMask_ = "";
   app_ = 0;
   clientCountryId_ = 0;
   clientNetsegmentId_ = 0;
   clientTotalPacket_ = 0L;
   clientIpAddr_ = "";
   tcpStatus_ = 0;
   serverCountryId_ = 0;
   serverNetsegmentId_ = 0;
   avgPktSize_ = 0L;
   serverPort_ = 0;
   serverTotalByte_ = 0L;
   totalPacketps_ = 0;
  }

  @java.lang.Override
  public final com.google.protobuf.UnknownFieldSet
  getUnknownFields() {
   return this.unknownFields;
  }
  private TCPLog(
    com.google.protobuf.CodedInputStream input,
    com.google.protobuf.ExtensionRegistryLite extensionRegistry)
    throws com.google.protobuf.InvalidProtocolBufferException {
   this();
   int mutable_bitField0_ = 0;
   com.google.protobuf.UnknownFieldSet.Builder unknownFields =
     com.google.protobuf.UnknownFieldSet.newBuilder();
   try {
    boolean done = false;
    while (!done) {
     int tag = input.readTag();
     switch (tag) {
      case 0:
       done = true;
       break;
      default: {
       if (!parseUnknownField(input, unknownFields,
                   extensionRegistry, tag)) {
        done = true;
       }
       break;
      }
      case 8: {
       bitField0_ |= 0x00000001;
       totalByteps_ = input.readInt32();
       break;
      }
      case 16: {
       bitField0_ |= 0x00000002;
       flowStartTime_ = input.readInt64();
       break;
      }
      case 24: {
       bitField0_ |= 0x00000004;
       date_ = input.readInt64();
       break;
      }
      case 32: {
       bitField0_ |= 0x00000008;
       serverTotalPacket_ = input.readInt64();
       break;
      }
      case 40: {
       bitField0_ |= 0x00000010;
       clientTotalByte_ = input.readInt64();
       break;
      }
      case 48: {
       bitField0_ |= 0x00000020;
       linkId_ = input.readInt32();
       break;
      }
      case 56: {
       bitField0_ |= 0x00000040;
       totalByte_ = input.readInt64();
       break;
      }
      case 64: {
       bitField0_ |= 0x00000080;
       flowEndTime_ = input.readInt64();
       break;
      }
      case 72: {
       bitField0_ |= 0x00000100;
       clientPort_ = input.readInt32();
       break;
      }
      case 80: {
       bitField0_ |= 0x00000200;
       protocol_ = input.readInt32();
       break;
      }
      case 88: {
       bitField0_ |= 0x00000400;
       totalPacket_ = input.readInt64();
       break;
      }
      case 96: {
       bitField0_ |= 0x00000800;
       flowDuration_ = input.readInt64();
       break;
      }
      case 106: {
       com.google.protobuf.ByteString bs = input.readBytes();
       bitField0_ |= 0x00001000;
       id_ = bs;
       break;
      }
      case 114: {
       com.google.protobuf.ByteString bs = input.readBytes();
       bitField0_ |= 0x00002000;
       serverIpAddr_ = bs;
       break;
      }
      case 122: {
       com.google.protobuf.ByteString bs = input.readBytes();
       bitField0_ |= 0x00004000;
       directionMask_ = bs;
       break;
      }
      case 128: {
       bitField0_ |= 0x00008000;
       app_ = input.readInt32();
       break;
      }
      case 136: {
       bitField0_ |= 0x00010000;
       clientCountryId_ = input.readInt32();
       break;
      }
      case 144: {
       bitField0_ |= 0x00020000;
       clientNetsegmentId_ = input.readInt32();
       break;
      }
      case 152: {
       bitField0_ |= 0x00040000;
       clientTotalPacket_ = input.readInt64();
       break;
      }
      case 162: {
       com.google.protobuf.ByteString bs = input.readBytes();
       bitField0_ |= 0x00080000;
       clientIpAddr_ = bs;
       break;
      }
      case 168: {
       bitField0_ |= 0x00100000;
       tcpStatus_ = input.readInt32();
       break;
      }
      case 176: {
       bitField0_ |= 0x00200000;
       serverCountryId_ = input.readInt32();
       break;
      }
      case 184: {
       bitField0_ |= 0x00400000;
       serverNetsegmentId_ = input.readInt32();
       break;
      }
      case 192: {
       bitField0_ |= 0x00800000;
       avgPktSize_ = input.readInt64();
       break;
      }
      case 200: {
       bitField0_ |= 0x01000000;
       serverPort_ = input.readInt32();
       break;
      }
      case 208: {
       bitField0_ |= 0x02000000;
       serverTotalByte_ = input.readInt64();
       break;
      }
      case 216: {
       bitField0_ |= 0x04000000;
       totalPacketps_ = input.readInt32();
       break;
      }
     }
    }
   } catch (com.google.protobuf.InvalidProtocolBufferException e) {
    throw e.setUnfinishedMessage(this);
   } catch (java.io.IOException e) {
    throw new com.google.protobuf.InvalidProtocolBufferException(
      e).setUnfinishedMessage(this);
   } finally {
    this.unknownFields = unknownFields.build();
    makeExtensionsImmutable();
   }
  }
  public static final com.google.protobuf.Descriptors.Descriptor
    getDescriptor() {
   return TCPLogOuterClass.internal_static_TCPLog_descriptor;
  }

  protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
    internalGetFieldAccessorTable() {
   return TCPLogOuterClass.internal_static_TCPLog_fieldAccessorTable
     .ensureFieldAccessorsInitialized(
       TCPLogOuterClass.TCPLog.class, TCPLogOuterClass.TCPLog.Builder.class);
  }

  private int bitField0_;
  public static final int TOTAL_BYTEPS_FIELD_NUMBER = 1;
  private int totalByteps_;
  /**
   * <code>optional int32 total_byteps = 1;</code>
   */
  public boolean hasTotalByteps() {
   return ((bitField0_ & 0x00000001) == 0x00000001);
  }
  /**
   * <code>optional int32 total_byteps = 1;</code>
   */
  public int getTotalByteps() {
   return totalByteps_;
  }

  public static final int FLOW_START_TIME_FIELD_NUMBER = 2;
  private long flowStartTime_;
  /**
   * <code>optional int64 flow_start_time = 2;</code>
   */
  public boolean hasFlowStartTime() {
   return ((bitField0_ & 0x00000002) == 0x00000002);
  }
  /**
   * <code>optional int64 flow_start_time = 2;</code>
   */
  public long getFlowStartTime() {
   return flowStartTime_;
  }

  public static final int DATE_FIELD_NUMBER = 3;
  private long date_;
  /**
   * <code>optional int64 date = 3;</code>
   */
  public boolean hasDate() {
   return ((bitField0_ & 0x00000004) == 0x00000004);
  }
  /**
   * <code>optional int64 date = 3;</code>
   */
  public long getDate() {
   return date_;
  }

  public static final int SERVER_TOTAL_PACKET_FIELD_NUMBER = 4;
  private long serverTotalPacket_;
  /**
   * <code>optional int64 server_total_packet = 4;</code>
   */
  public boolean hasServerTotalPacket() {
   return ((bitField0_ & 0x00000008) == 0x00000008);
  }
  /**
   * <code>optional int64 server_total_packet = 4;</code>
   */
  public long getServerTotalPacket() {
   return serverTotalPacket_;
  }

  public static final int CLIENT_TOTAL_BYTE_FIELD_NUMBER = 5;
  private long clientTotalByte_;
  /**
   * <code>optional int64 client_total_byte = 5;</code>
   */
  public boolean hasClientTotalByte() {
   return ((bitField0_ & 0x00000010) == 0x00000010);
  }
  /**
   * <code>optional int64 client_total_byte = 5;</code>
   */
  public long getClientTotalByte() {
   return clientTotalByte_;
  }

  public static final int LINK_ID_FIELD_NUMBER = 6;
  private int linkId_;
  /**
   * <code>optional int32 link_id = 6;</code>
   */
  public boolean hasLinkId() {
   return ((bitField0_ & 0x00000020) == 0x00000020);
  }
  /**
   * <code>optional int32 link_id = 6;</code>
   */
  public int getLinkId() {
   return linkId_;
  }

  public static final int TOTAL_BYTE_FIELD_NUMBER = 7;
  private long totalByte_;
  /**
   * <code>optional int64 total_byte = 7;</code>
   */
  public boolean hasTotalByte() {
   return ((bitField0_ & 0x00000040) == 0x00000040);
  }
  /**
   * <code>optional int64 total_byte = 7;</code>
   */
  public long getTotalByte() {
   return totalByte_;
  }

  public static final int FLOW_END_TIME_FIELD_NUMBER = 8;
  private long flowEndTime_;
  /**
   * <code>optional int64 flow_end_time = 8;</code>
   */
  public boolean hasFlowEndTime() {
   return ((bitField0_ & 0x00000080) == 0x00000080);
  }
  /**
   * <code>optional int64 flow_end_time = 8;</code>
   */
  public long getFlowEndTime() {
   return flowEndTime_;
  }

  public static final int CLIENT_PORT_FIELD_NUMBER = 9;
  private int clientPort_;
  /**
   * <code>optional int32 client_port = 9;</code>
   */
  public boolean hasClientPort() {
   return ((bitField0_ & 0x00000100) == 0x00000100);
  }
  /**
   * <code>optional int32 client_port = 9;</code>
   */
  public int getClientPort() {
   return clientPort_;
  }

  public static final int PROTOCOL_FIELD_NUMBER = 10;
  private int protocol_;
  /**
   * <code>optional int32 protocol = 10;</code>
   */
  public boolean hasProtocol() {
   return ((bitField0_ & 0x00000200) == 0x00000200);
  }
  /**
   * <code>optional int32 protocol = 10;</code>
   */
  public int getProtocol() {
   return protocol_;
  }

  public static final int TOTAL_PACKET_FIELD_NUMBER = 11;
  private long totalPacket_;
  /**
   * <code>optional int64 total_packet = 11;</code>
   */
  public boolean hasTotalPacket() {
   return ((bitField0_ & 0x00000400) == 0x00000400);
  }
  /**
   * <code>optional int64 total_packet = 11;</code>
   */
  public long getTotalPacket() {
   return totalPacket_;
  }

  public static final int FLOW_DURATION_FIELD_NUMBER = 12;
  private long flowDuration_;
  /**
   * <code>optional int64 flow_duration = 12;</code>
   */
  public boolean hasFlowDuration() {
   return ((bitField0_ & 0x00000800) == 0x00000800);
  }
  /**
   * <code>optional int64 flow_duration = 12;</code>
   */
  public long getFlowDuration() {
   return flowDuration_;
  }

  public static final int ID_FIELD_NUMBER = 13;
  private volatile java.lang.Object id_;
  /**
   * <code>optional string id = 13;</code>
   */
  public boolean hasId() {
   return ((bitField0_ & 0x00001000) == 0x00001000);
  }
  /**
   * <code>optional string id = 13;</code>
   */
  public java.lang.String getId() {
   java.lang.Object ref = id_;
   if (ref instanceof java.lang.String) {
    return (java.lang.String) ref;
   } else {
    com.google.protobuf.ByteString bs = 
      (com.google.protobuf.ByteString) ref;
    java.lang.String s = bs.toStringUtf8();
    if (bs.isValidUtf8()) {
     id_ = s;
    }
    return s;
   }
  }
  /**
   * <code>optional string id = 13;</code>
   */
  public com.google.protobuf.ByteString
    getIdBytes() {
   java.lang.Object ref = id_;
   if (ref instanceof java.lang.String) {
    com.google.protobuf.ByteString b = 
      com.google.protobuf.ByteString.copyFromUtf8(
        (java.lang.String) ref);
    id_ = b;
    return b;
   } else {
    return (com.google.protobuf.ByteString) ref;
   }
  }

  public static final int SERVER_IP_ADDR_FIELD_NUMBER = 14;
  private volatile java.lang.Object serverIpAddr_;
  /**
   * <code>optional string server_ip_addr = 14;</code>
   */
  public boolean hasServerIpAddr() {
   return ((bitField0_ & 0x00002000) == 0x00002000);
  }
  /**
   * <code>optional string server_ip_addr = 14;</code>
   */
  public java.lang.String getServerIpAddr() {
   java.lang.Object ref = serverIpAddr_;
   if (ref instanceof java.lang.String) {
    return (java.lang.String) ref;
   } else {
    com.google.protobuf.ByteString bs = 
      (com.google.protobuf.ByteString) ref;
    java.lang.String s = bs.toStringUtf8();
    if (bs.isValidUtf8()) {
     serverIpAddr_ = s;
    }
    return s;
   }
  }
  /**
   * <code>optional string server_ip_addr = 14;</code>
   */
  public com.google.protobuf.ByteString
    getServerIpAddrBytes() {
   java.lang.Object ref = serverIpAddr_;
   if (ref instanceof java.lang.String) {
    com.google.protobuf.ByteString b = 
      com.google.protobuf.ByteString.copyFromUtf8(
        (java.lang.String) ref);
    serverIpAddr_ = b;
    return b;
   } else {
    return (com.google.protobuf.ByteString) ref;
   }
  }

  public static final int DIRECTION_MASK_FIELD_NUMBER = 15;
  private volatile java.lang.Object directionMask_;
  /**
   * <code>optional string direction_mask = 15;</code>
   */
  public boolean hasDirectionMask() {
   return ((bitField0_ & 0x00004000) == 0x00004000);
  }
  /**
   * <code>optional string direction_mask = 15;</code>
   */
  public java.lang.String getDirectionMask() {
   java.lang.Object ref = directionMask_;
   if (ref instanceof java.lang.String) {
    return (java.lang.String) ref;
   } else {
    com.google.protobuf.ByteString bs = 
      (com.google.protobuf.ByteString) ref;
    java.lang.String s = bs.toStringUtf8();
    if (bs.isValidUtf8()) {
     directionMask_ = s;
    }
    return s;
   }
  }
  /**
   * <code>optional string direction_mask = 15;</code>
   */
  public com.google.protobuf.ByteString
    getDirectionMaskBytes() {
   java.lang.Object ref = directionMask_;
   if (ref instanceof java.lang.String) {
    com.google.protobuf.ByteString b = 
      com.google.protobuf.ByteString.copyFromUtf8(
        (java.lang.String) ref);
    directionMask_ = b;
    return b;
   } else {
    return (com.google.protobuf.ByteString) ref;
   }
  }

  public static final int APP_FIELD_NUMBER = 16;
  private int app_;
  /**
   * <code>optional int32 app = 16;</code>
   */
  public boolean hasApp() {
   return ((bitField0_ & 0x00008000) == 0x00008000);
  }
  /**
   * <code>optional int32 app = 16;</code>
   */
  public int getApp() {
   return app_;
  }

  public static final int CLIENT_COUNTRY_ID_FIELD_NUMBER = 17;
  private int clientCountryId_;
  /**
   * <code>optional int32 client_country_id = 17;</code>
   */
  public boolean hasClientCountryId() {
   return ((bitField0_ & 0x00010000) == 0x00010000);
  }
  /**
   * <code>optional int32 client_country_id = 17;</code>
   */
  public int getClientCountryId() {
   return clientCountryId_;
  }

  public static final int CLIENT_NETSEGMENT_ID_FIELD_NUMBER = 18;
  private int clientNetsegmentId_;
  /**
   * <code>optional int32 client_netsegment_id = 18;</code>
   */
  public boolean hasClientNetsegmentId() {
   return ((bitField0_ & 0x00020000) == 0x00020000);
  }
  /**
   * <code>optional int32 client_netsegment_id = 18;</code>
   */
  public int getClientNetsegmentId() {
   return clientNetsegmentId_;
  }

  public static final int CLIENT_TOTAL_PACKET_FIELD_NUMBER = 19;
  private long clientTotalPacket_;
  /**
   * <code>optional int64 client_total_packet = 19;</code>
   */
  public boolean hasClientTotalPacket() {
   return ((bitField0_ & 0x00040000) == 0x00040000);
  }
  /**
   * <code>optional int64 client_total_packet = 19;</code>
   */
  public long getClientTotalPacket() {
   return clientTotalPacket_;
  }

  public static final int CLIENT_IP_ADDR_FIELD_NUMBER = 20;
  private volatile java.lang.Object clientIpAddr_;
  /**
   * <code>optional string client_ip_addr = 20;</code>
   */
  public boolean hasClientIpAddr() {
   return ((bitField0_ & 0x00080000) == 0x00080000);
  }
  /**
   * <code>optional string client_ip_addr = 20;</code>
   */
  public java.lang.String getClientIpAddr() {
   java.lang.Object ref = clientIpAddr_;
   if (ref instanceof java.lang.String) {
    return (java.lang.String) ref;
   } else {
    com.google.protobuf.ByteString bs = 
      (com.google.protobuf.ByteString) ref;
    java.lang.String s = bs.toStringUtf8();
    if (bs.isValidUtf8()) {
     clientIpAddr_ = s;
    }
    return s;
   }
  }
  /**
   * <code>optional string client_ip_addr = 20;</code>
   */
  public com.google.protobuf.ByteString
    getClientIpAddrBytes() {
   java.lang.Object ref = clientIpAddr_;
   if (ref instanceof java.lang.String) {
    com.google.protobuf.ByteString b = 
      com.google.protobuf.ByteString.copyFromUtf8(
        (java.lang.String) ref);
    clientIpAddr_ = b;
    return b;
   } else {
    return (com.google.protobuf.ByteString) ref;
   }
  }

  public static final int TCP_STATUS_FIELD_NUMBER = 21;
  private int tcpStatus_;
  /**
   * <code>optional int32 tcp_status = 21;</code>
   */
  public boolean hasTcpStatus() {
   return ((bitField0_ & 0x00100000) == 0x00100000);
  }
  /**
   * <code>optional int32 tcp_status = 21;</code>
   */
  public int getTcpStatus() {
   return tcpStatus_;
  }

  public static final int SERVER_COUNTRY_ID_FIELD_NUMBER = 22;
  private int serverCountryId_;
  /**
   * <code>optional int32 server_country_id = 22;</code>
   */
  public boolean hasServerCountryId() {
   return ((bitField0_ & 0x00200000) == 0x00200000);
  }
  /**
   * <code>optional int32 server_country_id = 22;</code>
   */
  public int getServerCountryId() {
   return serverCountryId_;
  }

  public static final int SERVER_NETSEGMENT_ID_FIELD_NUMBER = 23;
  private int serverNetsegmentId_;
  /**
   * <code>optional int32 server_netsegment_id = 23;</code>
   */
  public boolean hasServerNetsegmentId() {
   return ((bitField0_ & 0x00400000) == 0x00400000);
  }
  /**
   * <code>optional int32 server_netsegment_id = 23;</code>
   */
  public int getServerNetsegmentId() {
   return serverNetsegmentId_;
  }

  public static final int AVG_PKT_SIZE_FIELD_NUMBER = 24;
  private long avgPktSize_;
  /**
   * <code>optional int64 avg_pkt_size = 24;</code>
   */
  public boolean hasAvgPktSize() {
   return ((bitField0_ & 0x00800000) == 0x00800000);
  }
  /**
   * <code>optional int64 avg_pkt_size = 24;</code>
   */
  public long getAvgPktSize() {
   return avgPktSize_;
  }

  public static final int SERVER_PORT_FIELD_NUMBER = 25;
  private int serverPort_;
  /**
   * <code>optional int32 server_port = 25;</code>
   */
  public boolean hasServerPort() {
   return ((bitField0_ & 0x01000000) == 0x01000000);
  }
  /**
   * <code>optional int32 server_port = 25;</code>
   */
  public int getServerPort() {
   return serverPort_;
  }

  public static final int SERVER_TOTAL_BYTE_FIELD_NUMBER = 26;
  private long serverTotalByte_;
  /**
   * <code>optional int64 server_total_byte = 26;</code>
   */
  public boolean hasServerTotalByte() {
   return ((bitField0_ & 0x02000000) == 0x02000000);
  }
  /**
   * <code>optional int64 server_total_byte = 26;</code>
   */
  public long getServerTotalByte() {
   return serverTotalByte_;
  }

  public static final int TOTAL_PACKETPS_FIELD_NUMBER = 27;
  private int totalPacketps_;
  /**
   * <code>optional int32 total_packetps = 27;</code>
   */
  public boolean hasTotalPacketps() {
   return ((bitField0_ & 0x04000000) == 0x04000000);
  }
  /**
   * <code>optional int32 total_packetps = 27;</code>
   */
  public int getTotalPacketps() {
   return totalPacketps_;
  }

  private byte memoizedIsInitialized = -1;
  public final boolean isInitialized() {
   byte isInitialized = memoizedIsInitialized;
   if (isInitialized == 1) return true;
   if (isInitialized == 0) return false;

   memoizedIsInitialized = 1;
   return true;
  }

  public void writeTo(com.google.protobuf.CodedOutputStream output)
            throws java.io.IOException {
   if (((bitField0_ & 0x00000001) == 0x00000001)) {
    output.writeInt32(1, totalByteps_);
   }
   if (((bitField0_ & 0x00000002) == 0x00000002)) {
    output.writeInt64(2, flowStartTime_);
   }
   if (((bitField0_ & 0x00000004) == 0x00000004)) {
    output.writeInt64(3, date_);
   }
   if (((bitField0_ & 0x00000008) == 0x00000008)) {
    output.writeInt64(4, serverTotalPacket_);
   }
   if (((bitField0_ & 0x00000010) == 0x00000010)) {
    output.writeInt64(5, clientTotalByte_);
   }
   if (((bitField0_ & 0x00000020) == 0x00000020)) {
    output.writeInt32(6, linkId_);
   }
   if (((bitField0_ & 0x00000040) == 0x00000040)) {
    output.writeInt64(7, totalByte_);
   }
   if (((bitField0_ & 0x00000080) == 0x00000080)) {
    output.writeInt64(8, flowEndTime_);
   }
   if (((bitField0_ & 0x00000100) == 0x00000100)) {
    output.writeInt32(9, clientPort_);
   }
   if (((bitField0_ & 0x00000200) == 0x00000200)) {
    output.writeInt32(10, protocol_);
   }
   if (((bitField0_ & 0x00000400) == 0x00000400)) {
    output.writeInt64(11, totalPacket_);
   }
   if (((bitField0_ & 0x00000800) == 0x00000800)) {
    output.writeInt64(12, flowDuration_);
   }
   if (((bitField0_ & 0x00001000) == 0x00001000)) {
    com.google.protobuf.GeneratedMessageV3.writeString(output, 13, id_);
   }
   if (((bitField0_ & 0x00002000) == 0x00002000)) {
    com.google.protobuf.GeneratedMessageV3.writeString(output, 14, serverIpAddr_);
   }
   if (((bitField0_ & 0x00004000) == 0x00004000)) {
    com.google.protobuf.GeneratedMessageV3.writeString(output, 15, directionMask_);
   }
   if (((bitField0_ & 0x00008000) == 0x00008000)) {
    output.writeInt32(16, app_);
   }
   if (((bitField0_ & 0x00010000) == 0x00010000)) {
    output.writeInt32(17, clientCountryId_);
   }
   if (((bitField0_ & 0x00020000) == 0x00020000)) {
    output.writeInt32(18, clientNetsegmentId_);
   }
   if (((bitField0_ & 0x00040000) == 0x00040000)) {
    output.writeInt64(19, clientTotalPacket_);
   }
   if (((bitField0_ & 0x00080000) == 0x00080000)) {
    com.google.protobuf.GeneratedMessageV3.writeString(output, 20, clientIpAddr_);
   }
   if (((bitField0_ & 0x00100000) == 0x00100000)) {
    output.writeInt32(21, tcpStatus_);
   }
   if (((bitField0_ & 0x00200000) == 0x00200000)) {
    output.writeInt32(22, serverCountryId_);
   }
   if (((bitField0_ & 0x00400000) == 0x00400000)) {
    output.writeInt32(23, serverNetsegmentId_);
   }
   if (((bitField0_ & 0x00800000) == 0x00800000)) {
    output.writeInt64(24, avgPktSize_);
   }
   if (((bitField0_ & 0x01000000) == 0x01000000)) {
    output.writeInt32(25, serverPort_);
   }
   if (((bitField0_ & 0x02000000) == 0x02000000)) {
    output.writeInt64(26, serverTotalByte_);
   }
   if (((bitField0_ & 0x04000000) == 0x04000000)) {
    output.writeInt32(27, totalPacketps_);
   }
   unknownFields.writeTo(output);
  }

  public int getSerializedSize() {
   int size = memoizedSize;
   if (size != -1) return size;

   size = 0;
   if (((bitField0_ & 0x00000001) == 0x00000001)) {
    size += com.google.protobuf.CodedOutputStream
     .computeInt32Size(1, totalByteps_);
   }
   if (((bitField0_ & 0x00000002) == 0x00000002)) {
    size += com.google.protobuf.CodedOutputStream
     .computeInt64Size(2, flowStartTime_);
   }
   if (((bitField0_ & 0x00000004) == 0x00000004)) {
    size += com.google.protobuf.CodedOutputStream
     .computeInt64Size(3, date_);
   }
   if (((bitField0_ & 0x00000008) == 0x00000008)) {
    size += com.google.protobuf.CodedOutputStream
     .computeInt64Size(4, serverTotalPacket_);
   }
   if (((bitField0_ & 0x00000010) == 0x00000010)) {
    size += com.google.protobuf.CodedOutputStream
     .computeInt64Size(5, clientTotalByte_);
   }
   if (((bitField0_ & 0x00000020) == 0x00000020)) {
    size += com.google.protobuf.CodedOutputStream
     .computeInt32Size(6, linkId_);
   }
   if (((bitField0_ & 0x00000040) == 0x00000040)) {
    size += com.google.protobuf.CodedOutputStream
     .computeInt64Size(7, totalByte_);
   }
   if (((bitField0_ & 0x00000080) == 0x00000080)) {
    size += com.google.protobuf.CodedOutputStream
     .computeInt64Size(8, flowEndTime_);
   }
   if (((bitField0_ & 0x00000100) == 0x00000100)) {
    size += com.google.protobuf.CodedOutputStream
     .computeInt32Size(9, clientPort_);
   }
   if (((bitField0_ & 0x00000200) == 0x00000200)) {
    size += com.google.protobuf.CodedOutputStream
     .computeInt32Size(10, protocol_);
   }
   if (((bitField0_ & 0x00000400) == 0x00000400)) {
    size += com.google.protobuf.CodedOutputStream
     .computeInt64Size(11, totalPacket_);
   }
   if (((bitField0_ & 0x00000800) == 0x00000800)) {
    size += com.google.protobuf.CodedOutputStream
     .computeInt64Size(12, flowDuration_);
   }
   if (((bitField0_ & 0x00001000) == 0x00001000)) {
    size += com.google.protobuf.GeneratedMessageV3.computeStringSize(13, id_);
   }
   if (((bitField0_ & 0x00002000) == 0x00002000)) {
    size += com.google.protobuf.GeneratedMessageV3.computeStringSize(14, serverIpAddr_);
   }
   if (((bitField0_ & 0x00004000) == 0x00004000)) {
    size += com.google.protobuf.GeneratedMessageV3.computeStringSize(15, directionMask_);
   }
   if (((bitField0_ & 0x00008000) == 0x00008000)) {
    size += com.google.protobuf.CodedOutputStream
     .computeInt32Size(16, app_);
   }
   if (((bitField0_ & 0x00010000) == 0x00010000)) {
    size += com.google.protobuf.CodedOutputStream
     .computeInt32Size(17, clientCountryId_);
   }
   if (((bitField0_ & 0x00020000) == 0x00020000)) {
    size += com.google.protobuf.CodedOutputStream
     .computeInt32Size(18, clientNetsegmentId_);
   }
   if (((bitField0_ & 0x00040000) == 0x00040000)) {
    size += com.google.protobuf.CodedOutputStream
     .computeInt64Size(19, clientTotalPacket_);
   }
   if (((bitField0_ & 0x00080000) == 0x00080000)) {
    size += com.google.protobuf.GeneratedMessageV3.computeStringSize(20, clientIpAddr_);
   }
   if (((bitField0_ & 0x00100000) == 0x00100000)) {
    size += com.google.protobuf.CodedOutputStream
     .computeInt32Size(21, tcpStatus_);
   }
   if (((bitField0_ & 0x00200000) == 0x00200000)) {
    size += com.google.protobuf.CodedOutputStream
     .computeInt32Size(22, serverCountryId_);
   }
   if (((bitField0_ & 0x00400000) == 0x00400000)) {
    size += com.google.protobuf.CodedOutputStream
     .computeInt32Size(23, serverNetsegmentId_);
   }
   if (((bitField0_ & 0x00800000) == 0x00800000)) {
    size += com.google.protobuf.CodedOutputStream
     .computeInt64Size(24, avgPktSize_);
   }
   if (((bitField0_ & 0x01000000) == 0x01000000)) {
    size += com.google.protobuf.CodedOutputStream
     .computeInt32Size(25, serverPort_);
   }
   if (((bitField0_ & 0x02000000) == 0x02000000)) {
    size += com.google.protobuf.CodedOutputStream
     .computeInt64Size(26, serverTotalByte_);
   }
   if (((bitField0_ & 0x04000000) == 0x04000000)) {
    size += com.google.protobuf.CodedOutputStream
     .computeInt32Size(27, totalPacketps_);
   }
   size += unknownFields.getSerializedSize();
   memoizedSize = size;
   return size;
  }

  private static final long serialVersionUID = 0L;
  @java.lang.Override
  public boolean equals(final java.lang.Object obj) {
   if (obj == this) {
    return true;
   }
   if (!(obj instanceof TCPLogOuterClass.TCPLog)) {
    return super.equals(obj);
   }
   TCPLogOuterClass.TCPLog other = (TCPLogOuterClass.TCPLog) obj;

   boolean result = true;
   result = result && (hasTotalByteps() == other.hasTotalByteps());
   if (hasTotalByteps()) {
    result = result && (getTotalByteps()
      == other.getTotalByteps());
   }
   result = result && (hasFlowStartTime() == other.hasFlowStartTime());
   if (hasFlowStartTime()) {
    result = result && (getFlowStartTime()
      == other.getFlowStartTime());
   }
   result = result && (hasDate() == other.hasDate());
   if (hasDate()) {
    result = result && (getDate()
      == other.getDate());
   }
   result = result && (hasServerTotalPacket() == other.hasServerTotalPacket());
   if (hasServerTotalPacket()) {
    result = result && (getServerTotalPacket()
      == other.getServerTotalPacket());
   }
   result = result && (hasClientTotalByte() == other.hasClientTotalByte());
   if (hasClientTotalByte()) {
    result = result && (getClientTotalByte()
      == other.getClientTotalByte());
   }
   result = result && (hasLinkId() == other.hasLinkId());
   if (hasLinkId()) {
    result = result && (getLinkId()
      == other.getLinkId());
   }
   result = result && (hasTotalByte() == other.hasTotalByte());
   if (hasTotalByte()) {
    result = result && (getTotalByte()
      == other.getTotalByte());
   }
   result = result && (hasFlowEndTime() == other.hasFlowEndTime());
   if (hasFlowEndTime()) {
    result = result && (getFlowEndTime()
      == other.getFlowEndTime());
   }
   result = result && (hasClientPort() == other.hasClientPort());
   if (hasClientPort()) {
    result = result && (getClientPort()
      == other.getClientPort());
   }
   result = result && (hasProtocol() == other.hasProtocol());
   if (hasProtocol()) {
    result = result && (getProtocol()
      == other.getProtocol());
   }
   result = result && (hasTotalPacket() == other.hasTotalPacket());
   if (hasTotalPacket()) {
    result = result && (getTotalPacket()
      == other.getTotalPacket());
   }
   result = result && (hasFlowDuration() == other.hasFlowDuration());
   if (hasFlowDuration()) {
    result = result && (getFlowDuration()
      == other.getFlowDuration());
   }
   result = result && (hasId() == other.hasId());
   if (hasId()) {
    result = result && getId()
      .equals(other.getId());
   }
   result = result && (hasServerIpAddr() == other.hasServerIpAddr());
   if (hasServerIpAddr()) {
    result = result && getServerIpAddr()
      .equals(other.getServerIpAddr());
   }
   result = result && (hasDirectionMask() == other.hasDirectionMask());
   if (hasDirectionMask()) {
    result = result && getDirectionMask()
      .equals(other.getDirectionMask());
   }
   result = result && (hasApp() == other.hasApp());
   if (hasApp()) {
    result = result && (getApp()
      == other.getApp());
   }
   result = result && (hasClientCountryId() == other.hasClientCountryId());
   if (hasClientCountryId()) {
    result = result && (getClientCountryId()
      == other.getClientCountryId());
   }
   result = result && (hasClientNetsegmentId() == other.hasClientNetsegmentId());
   if (hasClientNetsegmentId()) {
    result = result && (getClientNetsegmentId()
      == other.getClientNetsegmentId());
   }
   result = result && (hasClientTotalPacket() == other.hasClientTotalPacket());
   if (hasClientTotalPacket()) {
    result = result && (getClientTotalPacket()
      == other.getClientTotalPacket());
   }
   result = result && (hasClientIpAddr() == other.hasClientIpAddr());
   if (hasClientIpAddr()) {
    result = result && getClientIpAddr()
      .equals(other.getClientIpAddr());
   }
   result = result && (hasTcpStatus() == other.hasTcpStatus());
   if (hasTcpStatus()) {
    result = result && (getTcpStatus()
      == other.getTcpStatus());
   }
   result = result && (hasServerCountryId() == other.hasServerCountryId());
   if (hasServerCountryId()) {
    result = result && (getServerCountryId()
      == other.getServerCountryId());
   }
   result = result && (hasServerNetsegmentId() == other.hasServerNetsegmentId());
   if (hasServerNetsegmentId()) {
    result = result && (getServerNetsegmentId()
      == other.getServerNetsegmentId());
   }
   result = result && (hasAvgPktSize() == other.hasAvgPktSize());
   if (hasAvgPktSize()) {
    result = result && (getAvgPktSize()
      == other.getAvgPktSize());
   }
   result = result && (hasServerPort() == other.hasServerPort());
   if (hasServerPort()) {
    result = result && (getServerPort()
      == other.getServerPort());
   }
   result = result && (hasServerTotalByte() == other.hasServerTotalByte());
   if (hasServerTotalByte()) {
    result = result && (getServerTotalByte()
      == other.getServerTotalByte());
   }
   result = result && (hasTotalPacketps() == other.hasTotalPacketps());
   if (hasTotalPacketps()) {
    result = result && (getTotalPacketps()
      == other.getTotalPacketps());
   }
   result = result && unknownFields.equals(other.unknownFields);
   return result;
  }

  @java.lang.Override
  public int hashCode() {
   if (memoizedHashCode != 0) {
    return memoizedHashCode;
   }
   int hash = 41;
   hash = (19 * hash) + getDescriptor().hashCode();
   if (hasTotalByteps()) {
    hash = (37 * hash) + TOTAL_BYTEPS_FIELD_NUMBER;
    hash = (53 * hash) + getTotalByteps();
   }
   if (hasFlowStartTime()) {
    hash = (37 * hash) + FLOW_START_TIME_FIELD_NUMBER;
    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
      getFlowStartTime());
   }
   if (hasDate()) {
    hash = (37 * hash) + DATE_FIELD_NUMBER;
    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
      getDate());
   }
   if (hasServerTotalPacket()) {
    hash = (37 * hash) + SERVER_TOTAL_PACKET_FIELD_NUMBER;
    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
      getServerTotalPacket());
   }
   if (hasClientTotalByte()) {
    hash = (37 * hash) + CLIENT_TOTAL_BYTE_FIELD_NUMBER;
    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
      getClientTotalByte());
   }
   if (hasLinkId()) {
    hash = (37 * hash) + LINK_ID_FIELD_NUMBER;
    hash = (53 * hash) + getLinkId();
   }
   if (hasTotalByte()) {
    hash = (37 * hash) + TOTAL_BYTE_FIELD_NUMBER;
    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
      getTotalByte());
   }
   if (hasFlowEndTime()) {
    hash = (37 * hash) + FLOW_END_TIME_FIELD_NUMBER;
    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
      getFlowEndTime());
   }
   if (hasClientPort()) {
    hash = (37 * hash) + CLIENT_PORT_FIELD_NUMBER;
    hash = (53 * hash) + getClientPort();
   }
   if (hasProtocol()) {
    hash = (37 * hash) + PROTOCOL_FIELD_NUMBER;
    hash = (53 * hash) + getProtocol();
   }
   if (hasTotalPacket()) {
    hash = (37 * hash) + TOTAL_PACKET_FIELD_NUMBER;
    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
      getTotalPacket());
   }
   if (hasFlowDuration()) {
    hash = (37 * hash) + FLOW_DURATION_FIELD_NUMBER;
    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
      getFlowDuration());
   }
   if (hasId()) {
    hash = (37 * hash) + ID_FIELD_NUMBER;
    hash = (53 * hash) + getId().hashCode();
   }
   if (hasServerIpAddr()) {
    hash = (37 * hash) + SERVER_IP_ADDR_FIELD_NUMBER;
    hash = (53 * hash) + getServerIpAddr().hashCode();
   }
   if (hasDirectionMask()) {
    hash = (37 * hash) + DIRECTION_MASK_FIELD_NUMBER;
    hash = (53 * hash) + getDirectionMask().hashCode();
   }
   if (hasApp()) {
    hash = (37 * hash) + APP_FIELD_NUMBER;
    hash = (53 * hash) + getApp();
   }
   if (hasClientCountryId()) {
    hash = (37 * hash) + CLIENT_COUNTRY_ID_FIELD_NUMBER;
    hash = (53 * hash) + getClientCountryId();
   }
   if (hasClientNetsegmentId()) {
    hash = (37 * hash) + CLIENT_NETSEGMENT_ID_FIELD_NUMBER;
    hash = (53 * hash) + getClientNetsegmentId();
   }
   if (hasClientTotalPacket()) {
    hash = (37 * hash) + CLIENT_TOTAL_PACKET_FIELD_NUMBER;
    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
      getClientTotalPacket());
   }
   if (hasClientIpAddr()) {
    hash = (37 * hash) + CLIENT_IP_ADDR_FIELD_NUMBER;
    hash = (53 * hash) + getClientIpAddr().hashCode();
   }
   if (hasTcpStatus()) {
    hash = (37 * hash) + TCP_STATUS_FIELD_NUMBER;
    hash = (53 * hash) + getTcpStatus();
   }
   if (hasServerCountryId()) {
    hash = (37 * hash) + SERVER_COUNTRY_ID_FIELD_NUMBER;
    hash = (53 * hash) + getServerCountryId();
   }
   if (hasServerNetsegmentId()) {
    hash = (37 * hash) + SERVER_NETSEGMENT_ID_FIELD_NUMBER;
    hash = (53 * hash) + getServerNetsegmentId();
   }
   if (hasAvgPktSize()) {
    hash = (37 * hash) + AVG_PKT_SIZE_FIELD_NUMBER;
    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
      getAvgPktSize());
   }
   if (hasServerPort()) {
    hash = (37 * hash) + SERVER_PORT_FIELD_NUMBER;
    hash = (53 * hash) + getServerPort();
   }
   if (hasServerTotalByte()) {
    hash = (37 * hash) + SERVER_TOTAL_BYTE_FIELD_NUMBER;
    hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
      getServerTotalByte());
   }
   if (hasTotalPacketps()) {
    hash = (37 * hash) + TOTAL_PACKETPS_FIELD_NUMBER;
    hash = (53 * hash) + getTotalPacketps();
   }
   hash = (29 * hash) + unknownFields.hashCode();
   memoizedHashCode = hash;
   return hash;
  }

  public static TCPLogOuterClass.TCPLog parseFrom(
    java.nio.ByteBuffer data)
    throws com.google.protobuf.InvalidProtocolBufferException {
   return PARSER.parseFrom(data);
  }
  public static TCPLogOuterClass.TCPLog parseFrom(
    java.nio.ByteBuffer data,
    com.google.protobuf.ExtensionRegistryLite extensionRegistry)
    throws com.google.protobuf.InvalidProtocolBufferException {
   return PARSER.parseFrom(data, extensionRegistry);
  }
  public static TCPLogOuterClass.TCPLog parseFrom(
    com.google.protobuf.ByteString data)
    throws com.google.protobuf.InvalidProtocolBufferException {
   return PARSER.parseFrom(data);
  }
  public static TCPLogOuterClass.TCPLog parseFrom(
    com.google.protobuf.ByteString data,
    com.google.protobuf.ExtensionRegistryLite extensionRegistry)
    throws com.google.protobuf.InvalidProtocolBufferException {
   return PARSER.parseFrom(data, extensionRegistry);
  }
  public static TCPLogOuterClass.TCPLog parseFrom(byte[] data)
    throws com.google.protobuf.InvalidProtocolBufferException {
   return PARSER.parseFrom(data);
  }
  public static TCPLogOuterClass.TCPLog parseFrom(
    byte[] data,
    com.google.protobuf.ExtensionRegistryLite extensionRegistry)
    throws com.google.protobuf.InvalidProtocolBufferException {
   return PARSER.parseFrom(data, extensionRegistry);
  }
  public static TCPLogOuterClass.TCPLog parseFrom(java.io.InputStream input)
    throws java.io.IOException {
   return com.google.protobuf.GeneratedMessageV3
     .parseWithIOException(PARSER, input);
  }
  public static TCPLogOuterClass.TCPLog parseFrom(
    java.io.InputStream input,
    com.google.protobuf.ExtensionRegistryLite extensionRegistry)
    throws java.io.IOException {
   return com.google.protobuf.GeneratedMessageV3
     .parseWithIOException(PARSER, input, extensionRegistry);
  }
  public static TCPLogOuterClass.TCPLog parseDelimitedFrom(java.io.InputStream input)
    throws java.io.IOException {
   return com.google.protobuf.GeneratedMessageV3
     .parseDelimitedWithIOException(PARSER, input);
  }
  public static TCPLogOuterClass.TCPLog parseDelimitedFrom(
    java.io.InputStream input,
    com.google.protobuf.ExtensionRegistryLite extensionRegistry)
    throws java.io.IOException {
   return com.google.protobuf.GeneratedMessageV3
     .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
  }
  public static TCPLogOuterClass.TCPLog parseFrom(
    com.google.protobuf.CodedInputStream input)
    throws java.io.IOException {
   return com.google.protobuf.GeneratedMessageV3
     .parseWithIOException(PARSER, input);
  }
  public static TCPLogOuterClass.TCPLog parseFrom(
    com.google.protobuf.CodedInputStream input,
    com.google.protobuf.ExtensionRegistryLite extensionRegistry)
    throws java.io.IOException {
   return com.google.protobuf.GeneratedMessageV3
     .parseWithIOException(PARSER, input, extensionRegistry);
  }

  public Builder newBuilderForType() { return newBuilder(); }
  public static Builder newBuilder() {
   return DEFAULT_INSTANCE.toBuilder();
  }
  public static Builder newBuilder(TCPLogOuterClass.TCPLog prototype) {
   return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
  }
  public Builder toBuilder() {
   return this == DEFAULT_INSTANCE
     ? new Builder() : new Builder().mergeFrom(this);
  }

  @java.lang.Override
  protected Builder newBuilderForType(
    com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
   Builder builder = new Builder(parent);
   return builder;
  }
  /**
   * Protobuf type {@code TCPLog}
   */
  public static final class Builder extends
    com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
    // @@protoc_insertion_point(builder_implements:TCPLog)
    TCPLogOuterClass.TCPLogOrBuilder {
   public static final com.google.protobuf.Descriptors.Descriptor
     getDescriptor() {
    return TCPLogOuterClass.internal_static_TCPLog_descriptor;
   }

   protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
     internalGetFieldAccessorTable() {
    return TCPLogOuterClass.internal_static_TCPLog_fieldAccessorTable
      .ensureFieldAccessorsInitialized(
        TCPLogOuterClass.TCPLog.class, TCPLogOuterClass.TCPLog.Builder.class);
   }

   // Construct using TCPLogOuterClass.TCPLog.newBuilder()
   private Builder() {
    maybeForceBuilderInitialization();
   }

   private Builder(
     com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
    super(parent);
    maybeForceBuilderInitialization();
   }
   private void maybeForceBuilderInitialization() {
    if (com.google.protobuf.GeneratedMessageV3
        .alwaysUseFieldBuilders) {
    }
   }
   public Builder clear() {
    super.clear();
    totalByteps_ = 0;
    bitField0_ = (bitField0_ & ~0x00000001);
    flowStartTime_ = 0L;
    bitField0_ = (bitField0_ & ~0x00000002);
    date_ = 0L;
    bitField0_ = (bitField0_ & ~0x00000004);
    serverTotalPacket_ = 0L;
    bitField0_ = (bitField0_ & ~0x00000008);
    clientTotalByte_ = 0L;
    bitField0_ = (bitField0_ & ~0x00000010);
    linkId_ = 0;
    bitField0_ = (bitField0_ & ~0x00000020);
    totalByte_ = 0L;
    bitField0_ = (bitField0_ & ~0x00000040);
    flowEndTime_ = 0L;
    bitField0_ = (bitField0_ & ~0x00000080);
    clientPort_ = 0;
    bitField0_ = (bitField0_ & ~0x00000100);
    protocol_ = 0;
    bitField0_ = (bitField0_ & ~0x00000200);
    totalPacket_ = 0L;
    bitField0_ = (bitField0_ & ~0x00000400);
    flowDuration_ = 0L;
    bitField0_ = (bitField0_ & ~0x00000800);
    id_ = "";
    bitField0_ = (bitField0_ & ~0x00001000);
    serverIpAddr_ = "";
    bitField0_ = (bitField0_ & ~0x00002000);
    directionMask_ = "";
    bitField0_ = (bitField0_ & ~0x00004000);
    app_ = 0;
    bitField0_ = (bitField0_ & ~0x00008000);
    clientCountryId_ = 0;
    bitField0_ = (bitField0_ & ~0x00010000);
    clientNetsegmentId_ = 0;
    bitField0_ = (bitField0_ & ~0x00020000);
    clientTotalPacket_ = 0L;
    bitField0_ = (bitField0_ & ~0x00040000);
    clientIpAddr_ = "";
    bitField0_ = (bitField0_ & ~0x00080000);
    tcpStatus_ = 0;
    bitField0_ = (bitField0_ & ~0x00100000);
    serverCountryId_ = 0;
    bitField0_ = (bitField0_ & ~0x00200000);
    serverNetsegmentId_ = 0;
    bitField0_ = (bitField0_ & ~0x00400000);
    avgPktSize_ = 0L;
    bitField0_ = (bitField0_ & ~0x00800000);
    serverPort_ = 0;
    bitField0_ = (bitField0_ & ~0x01000000);
    serverTotalByte_ = 0L;
    bitField0_ = (bitField0_ & ~0x02000000);
    totalPacketps_ = 0;
    bitField0_ = (bitField0_ & ~0x04000000);
    return this;
   }

   public com.google.protobuf.Descriptors.Descriptor
     getDescriptorForType() {
    return TCPLogOuterClass.internal_static_TCPLog_descriptor;
   }

   public TCPLogOuterClass.TCPLog getDefaultInstanceForType() {
    return TCPLogOuterClass.TCPLog.getDefaultInstance();
   }

   public TCPLogOuterClass.TCPLog build() {
    TCPLogOuterClass.TCPLog result = buildPartial();
    if (!result.isInitialized()) {
     throw newUninitializedMessageException(result);
    }
    return result;
   }

   public TCPLogOuterClass.TCPLog buildPartial() {
    TCPLogOuterClass.TCPLog result = new TCPLogOuterClass.TCPLog(this);
    int from_bitField0_ = bitField0_;
    int to_bitField0_ = 0;
    if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
     to_bitField0_ |= 0x00000001;
    }
    result.totalByteps_ = totalByteps_;
    if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
     to_bitField0_ |= 0x00000002;
    }
    result.flowStartTime_ = flowStartTime_;
    if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
     to_bitField0_ |= 0x00000004;
    }
    result.date_ = date_;
    if (((from_bitField0_ & 0x00000008) == 0x00000008)) {
     to_bitField0_ |= 0x00000008;
    }
    result.serverTotalPacket_ = serverTotalPacket_;
    if (((from_bitField0_ & 0x00000010) == 0x00000010)) {
     to_bitField0_ |= 0x00000010;
    }
    result.clientTotalByte_ = clientTotalByte_;
    if (((from_bitField0_ & 0x00000020) == 0x00000020)) {
     to_bitField0_ |= 0x00000020;
    }
    result.linkId_ = linkId_;
    if (((from_bitField0_ & 0x00000040) == 0x00000040)) {
     to_bitField0_ |= 0x00000040;
    }
    result.totalByte_ = totalByte_;
    if (((from_bitField0_ & 0x00000080) == 0x00000080)) {
     to_bitField0_ |= 0x00000080;
    }
    result.flowEndTime_ = flowEndTime_;
    if (((from_bitField0_ & 0x00000100) == 0x00000100)) {
     to_bitField0_ |= 0x00000100;
    }
    result.clientPort_ = clientPort_;
    if (((from_bitField0_ & 0x00000200) == 0x00000200)) {
     to_bitField0_ |= 0x00000200;
    }
    result.protocol_ = protocol_;
    if (((from_bitField0_ & 0x00000400) == 0x00000400)) {
     to_bitField0_ |= 0x00000400;
    }
    result.totalPacket_ = totalPacket_;
    if (((from_bitField0_ & 0x00000800) == 0x00000800)) {
     to_bitField0_ |= 0x00000800;
    }
    result.flowDuration_ = flowDuration_;
    if (((from_bitField0_ & 0x00001000) == 0x00001000)) {
     to_bitField0_ |= 0x00001000;
    }
    result.id_ = id_;
    if (((from_bitField0_ & 0x00002000) == 0x00002000)) {
     to_bitField0_ |= 0x00002000;
    }
    result.serverIpAddr_ = serverIpAddr_;
    if (((from_bitField0_ & 0x00004000) == 0x00004000)) {
     to_bitField0_ |= 0x00004000;
    }
    result.directionMask_ = directionMask_;
    if (((from_bitField0_ & 0x00008000) == 0x00008000)) {
     to_bitField0_ |= 0x00008000;
    }
    result.app_ = app_;
    if (((from_bitField0_ & 0x00010000) == 0x00010000)) {
     to_bitField0_ |= 0x00010000;
    }
    result.clientCountryId_ = clientCountryId_;
    if (((from_bitField0_ & 0x00020000) == 0x00020000)) {
     to_bitField0_ |= 0x00020000;
    }
    result.clientNetsegmentId_ = clientNetsegmentId_;
    if (((from_bitField0_ & 0x00040000) == 0x00040000)) {
     to_bitField0_ |= 0x00040000;
    }
    result.clientTotalPacket_ = clientTotalPacket_;
    if (((from_bitField0_ & 0x00080000) == 0x00080000)) {
     to_bitField0_ |= 0x00080000;
    }
    result.clientIpAddr_ = clientIpAddr_;
    if (((from_bitField0_ & 0x00100000) == 0x00100000)) {
     to_bitField0_ |= 0x00100000;
    }
    result.tcpStatus_ = tcpStatus_;
    if (((from_bitField0_ & 0x00200000) == 0x00200000)) {
     to_bitField0_ |= 0x00200000;
    }
    result.serverCountryId_ = serverCountryId_;
    if (((from_bitField0_ & 0x00400000) == 0x00400000)) {
     to_bitField0_ |= 0x00400000;
    }
    result.serverNetsegmentId_ = serverNetsegmentId_;
    if (((from_bitField0_ & 0x00800000) == 0x00800000)) {
     to_bitField0_ |= 0x00800000;
    }
    result.avgPktSize_ = avgPktSize_;
    if (((from_bitField0_ & 0x01000000) == 0x01000000)) {
     to_bitField0_ |= 0x01000000;
    }
    result.serverPort_ = serverPort_;
    if (((from_bitField0_ & 0x02000000) == 0x02000000)) {
     to_bitField0_ |= 0x02000000;
    }
    result.serverTotalByte_ = serverTotalByte_;
    if (((from_bitField0_ & 0x04000000) == 0x04000000)) {
     to_bitField0_ |= 0x04000000;
    }
    result.totalPacketps_ = totalPacketps_;
    result.bitField0_ = to_bitField0_;
    onBuilt();
    return result;
   }

   public Builder clone() {
    return (Builder) super.clone();
   }
   public Builder setField(
     com.google.protobuf.Descriptors.FieldDescriptor field,
     Object value) {
    return (Builder) super.setField(field, value);
   }
   public Builder clearField(
     com.google.protobuf.Descriptors.FieldDescriptor field) {
    return (Builder) super.clearField(field);
   }
   public Builder clearOneof(
     com.google.protobuf.Descriptors.OneofDescriptor oneof) {
    return (Builder) super.clearOneof(oneof);
   }
   public Builder setRepeatedField(
     com.google.protobuf.Descriptors.FieldDescriptor field,
     int index, Object value) {
    return (Builder) super.setRepeatedField(field, index, value);
   }
   public Builder addRepeatedField(
     com.google.protobuf.Descriptors.FieldDescriptor field,
     Object value) {
    return (Builder) super.addRepeatedField(field, value);
   }
   public Builder mergeFrom(com.google.protobuf.Message other) {
    if (other instanceof TCPLogOuterClass.TCPLog) {
     return mergeFrom((TCPLogOuterClass.TCPLog)other);
    } else {
     super.mergeFrom(other);
     return this;
    }
   }

   public Builder mergeFrom(TCPLogOuterClass.TCPLog other) {
    if (other == TCPLogOuterClass.TCPLog.getDefaultInstance()) return this;
    if (other.hasTotalByteps()) {
     setTotalByteps(other.getTotalByteps());
    }
    if (other.hasFlowStartTime()) {
     setFlowStartTime(other.getFlowStartTime());
    }
    if (other.hasDate()) {
     setDate(other.getDate());
    }
    if (other.hasServerTotalPacket()) {
     setServerTotalPacket(other.getServerTotalPacket());
    }
    if (other.hasClientTotalByte()) {
     setClientTotalByte(other.getClientTotalByte());
    }
    if (other.hasLinkId()) {
     setLinkId(other.getLinkId());
    }
    if (other.hasTotalByte()) {
     setTotalByte(other.getTotalByte());
    }
    if (other.hasFlowEndTime()) {
     setFlowEndTime(other.getFlowEndTime());
    }
    if (other.hasClientPort()) {
     setClientPort(other.getClientPort());
    }
    if (other.hasProtocol()) {
     setProtocol(other.getProtocol());
    }
    if (other.hasTotalPacket()) {
     setTotalPacket(other.getTotalPacket());
    }
    if (other.hasFlowDuration()) {
     setFlowDuration(other.getFlowDuration());
    }
    if (other.hasId()) {
     bitField0_ |= 0x00001000;
     id_ = other.id_;
     onChanged();
    }
    if (other.hasServerIpAddr()) {
     bitField0_ |= 0x00002000;
     serverIpAddr_ = other.serverIpAddr_;
     onChanged();
    }
    if (other.hasDirectionMask()) {
     bitField0_ |= 0x00004000;
     directionMask_ = other.directionMask_;
     onChanged();
    }
    if (other.hasApp()) {
     setApp(other.getApp());
    }
    if (other.hasClientCountryId()) {
     setClientCountryId(other.getClientCountryId());
    }
    if (other.hasClientNetsegmentId()) {
     setClientNetsegmentId(other.getClientNetsegmentId());
    }
    if (other.hasClientTotalPacket()) {
     setClientTotalPacket(other.getClientTotalPacket());
    }
    if (other.hasClientIpAddr()) {
     bitField0_ |= 0x00080000;
     clientIpAddr_ = other.clientIpAddr_;
     onChanged();
    }
    if (other.hasTcpStatus()) {
     setTcpStatus(other.getTcpStatus());
    }
    if (other.hasServerCountryId()) {
     setServerCountryId(other.getServerCountryId());
    }
    if (other.hasServerNetsegmentId()) {
     setServerNetsegmentId(other.getServerNetsegmentId());
    }
    if (other.hasAvgPktSize()) {
     setAvgPktSize(other.getAvgPktSize());
    }
    if (other.hasServerPort()) {
     setServerPort(other.getServerPort());
    }
    if (other.hasServerTotalByte()) {
     setServerTotalByte(other.getServerTotalByte());
    }
    if (other.hasTotalPacketps()) {
     setTotalPacketps(other.getTotalPacketps());
    }
    this.mergeUnknownFields(other.unknownFields);
    onChanged();
    return this;
   }

   public final boolean isInitialized() {
    return true;
   }

   public Builder mergeFrom(
     com.google.protobuf.CodedInputStream input,
     com.google.protobuf.ExtensionRegistryLite extensionRegistry)
     throws java.io.IOException {
    TCPLogOuterClass.TCPLog parsedMessage = null;
    try {
     parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
    } catch (com.google.protobuf.InvalidProtocolBufferException e) {
     parsedMessage = (TCPLogOuterClass.TCPLog) e.getUnfinishedMessage();
     throw e.unwrapIOException();
    } finally {
     if (parsedMessage != null) {
      mergeFrom(parsedMessage);
     }
    }
    return this;
   }
   private int bitField0_;

   private int totalByteps_ ;
   /**
    * <code>optional int32 total_byteps = 1;</code>
    */
   public boolean hasTotalByteps() {
    return ((bitField0_ & 0x00000001) == 0x00000001);
   }
   /**
    * <code>optional int32 total_byteps = 1;</code>
    */
   public int getTotalByteps() {
    return totalByteps_;
   }
   /**
    * <code>optional int32 total_byteps = 1;</code>
    */
   public Builder setTotalByteps(int value) {
    bitField0_ |= 0x00000001;
    totalByteps_ = value;
    onChanged();
    return this;
   }
   /**
    * <code>optional int32 total_byteps = 1;</code>
    */
   public Builder clearTotalByteps() {
    bitField0_ = (bitField0_ & ~0x00000001);
    totalByteps_ = 0;
    onChanged();
    return this;
   }

   private long flowStartTime_ ;
   /**
    * <code>optional int64 flow_start_time = 2;</code>
    */
   public boolean hasFlowStartTime() {
    return ((bitField0_ & 0x00000002) == 0x00000002);
   }
   /**
    * <code>optional int64 flow_start_time = 2;</code>
    */
   public long getFlowStartTime() {
    return flowStartTime_;
   }
   /**
    * <code>optional int64 flow_start_time = 2;</code>
    */
   public Builder setFlowStartTime(long value) {
    bitField0_ |= 0x00000002;
    flowStartTime_ = value;
    onChanged();
    return this;
   }
   /**
    * <code>optional int64 flow_start_time = 2;</code>
    */
   public Builder clearFlowStartTime() {
    bitField0_ = (bitField0_ & ~0x00000002);
    flowStartTime_ = 0L;
    onChanged();
    return this;
   }

   private long date_ ;
   /**
    * <code>optional int64 date = 3;</code>
    */
   public boolean hasDate() {
    return ((bitField0_ & 0x00000004) == 0x