[Google Protobuf] For Java in Android Studio - Basic example code 기본 소스 코드 사용 샘플

Posted by [하늘이]
2020. 1. 30. 12:16 IT/C, C++
반응형

[Google Protobuf] For Java in Android Studio - Basic example code 기본 소스 코드 사용 샘플

※ 관련글

  • Google Protobuf
  1. [Google Protobuf] For Java in Android Studio - 설치 및 proto 파일 컴파일
  2. [Google Protobuf] For Java in Android Studio - Gen Java 파일 Android Studio 적용
  3. [Google Protobuf] For Java in Android Studio - Basic example code 기본 소스 코드 사용 샘플
  4. [Google Protobuf] For C++ in Linux - Settings C++ 빌드 환경 만들기
  5. [Google Protobuf] For C++ in Linux - Basic example code 기본 소스 코드 사용 샘플
  • Nanopb Basic type value example
  1. [Nanopb for Google protobuf] Basic type proto sample
  2. [Nanopb for Google protobuf] Basic type proto sample - Sample proto file
  3. [Nanopb for Google protobuf] Basic type proto sample - Encode sample code
  4. [Nanopb for Google protobuf] Basic type proto sample - Decode sample code
  • Nanopb String / bytes value example
  1. [Nanopb for Google protobuf] String/Bytes type proto
  2. [Nanopb for Google protobuf] String/Bytes type proto - Sample proto file 
  3. [Nanopb for Google protobuf] String/Bytes type proto - Encode example code 1
  4. [Nanopb for Google protobuf] String/Bytes type proto - Encode example code 2
  5. [Nanopb for Google protobuf] String/Bytes type proto - Decode example code
  • Nanopb basic submsg example
  1. [Nanopb for Google protobuf] Sub message - Example proto file
  2. [Nanopb for Google protobuf] Sub message - Encode example code
  3. [Nanopb for Google protobuf] Sub message - Decode example code
  • Nanopb array submsg value example

  1. [Nanopb for Google protobuf] Array Sub message - Example proto file
  2. [Nanopb for Google protobuf] Array Sub message - Encode example code
  3. [Nanopb for Google protobuf] Array Sub message - Decode example code


아래 proto file 기준

message PeriodicPos {
  required EngineOnOffStatus engineOnOffStatus= 1 [default = OFF];
  required uint64 runDistance = 2;
  required string timeFor1stPos = 3;
  required int32 intervalTimeForPos = 4;

  enum EngineOnOffStatus {
    OFF = 0;
    ON = 1;
  }


  message Pos {
    required double lon = 1;
    required double lat = 2;
    required int32 speed = 3;
  }
  repeated Pos posList = 5;
}

* 객체 생성 후 정보 저장

1
2
3
4
5
6
7
8
9
10
11
PeriodicPosProto.PeriodicPos.Builder periodicPosPro = PeriodicPosProto.PeriodicPos.newBuilder();
periodicPosPro.setEngineOnOffStatus(PeriodicPosProto.PeriodicPos.EngineOnOffStatus.ON);
periodicPosPro.setRunDistance(2000000);
periodicPosPro.setTimeFor1StPos("20190109201201");
periodicPosPro.setIntervalTimeForPos(10);
 
​for(int a = 0 ; 12 > a; a ++)
{
  PeriodicPos.Pos.Builderpos Proto  PeriodicPos.Pos.newBuilder().setLat(127.1261233).setLon(37.4498712).setSpeed(a+10);
  periodicPosPro.addPosList(posProto);
}
cs

 

* 생성된 데이터를 serialize 된 데이터 파일 생성

FileOutputStream fos = new FileOutputStream(Def.FILE_ROOT + File.separator + "test.txt");

periodicPosPro.build().writeTo(fos);

 

* 파일에 저장된 serialize 된 데이터를 deserialize 하기

FileInputStream fis = new FileInputStream(Def.FILE_ROOT + File.separator + "test.txt");

PeriodicPos deserializePosList = PeriodicPos.parseFrom(fis);

mLog.e("@@@@@@@@@@@@ deserialize :" + deserializePosList.toString());

* 생성된 데이터를 byte[] 데이터로 전환

ByteArrayOutputStream baos = new ByteArrayOutputStream();
CodedOutputStream cout = CodedOutputStream.newInstance(baos);
periodicPosPro.build().writeTo(cout);
cout.flush();

mLog.e("---> " + baos.size() + " data:" + HexPrint.bytesToHex(baos.toByteArray()));

baos.toByteArray() 을 사용하여 byte array를 얻으면 된다.



반응형