개인 공부

Protocol Buffer 사용

Machine_웅 2022. 12. 22. 09:43
728x90
반응형

앞서   프로토 파일을 만드는것은  아래의 링크에 있다.

https://machine-woong.tistory.com/639

 

Android Protocl Buffers ver.3 사용하기 proto3

1. build.gradle(모듈) plugins { id 'com.android.application' id ('com.google.protobuf') version "0.8.17" } 추가 id ('com.google.protobuf') version "0.8.17" dependencies { ..... // Proto Buffer implementation 'androidx.datastore:datastore:1.0.0' impleme

machine-woong.tistory.com


Setter

 Person.newBuilder()
                .setName("test11")
                .setId(4)
                .setEmail("test@gmail.com").build();
                
 //--------------------------------------------------------
 // 구글예시
 Person john =
  Person.newBuilder()
    .setId(1234)
    .setName("John Doe")
    .setEmail("jdoe@example.com")
    .addPhones(
      Person.PhoneNumber.newBuilder()
        .setNumber("555-4321")
        .setType(Person.PhoneType.HOME))
    .build();

Edit 

생성된 각Message 클래스들은 JavaString 과 같이 불변의 객체이다. 

한번Message 클래스가 객체로 생성되면 해당 객체의 값은 절대로 바꿀 수 없다.

 

, 값을 바꾸고 싶거든 또 다른 객체를 생성해야 한다는 이야기이며, 

Message 클래스는 Builder 클래스의Build() 메소드를 통해서만 생성이 가능하다.

 

방법1 ) 프로토콜 버퍼 수정시에는 toBuilder()로 빌더를 리턴 받아서 setter를 통해 값을 바꾸고

다시 .build()를 해줘야 한다.

  mPerson = mPerson.toBuilder().setName("test333").build();

방법2)  덮어쓰기

  • mergeFrom(Message other): (빌더 전용) other단일 스칼라 필드를 덮어쓰고
    복합 필드를 병합하고 반복되는 필드를 연결하여 의 내용을 이 메시지로 병합합니다.
      Person person = Person.newBuilder()
                .setName("테스터")
                .setId(1)
                .setEmail("test@naver.com")
                .setProfile(Profile.newBuilder()
                        .setHeight(185.01)
                        .setWeight(70)
                        .build())
                .setCar(Car.newBuilder()
                        .setBrand("쉐보레")
                        .setYear(2018)
                        .setColor("black")
                        .build())
                .build();

      // Car 객체 데이터 변경
      person = person.toBuilder().mergeCar(Car.newBuilder().setColor("white").setYear(2020).setBrand("samsung").build()).build();

방법3)  newBuilder 를 사용한 덮어쓰기 2 

        Person person = Person.newBuilder()
                .setName("테스터")
                .setId(1)
                .setEmail("test@naver.com")
                .setProfile(Profile.newBuilder()
                        .setHeight(185.01)
                        .setWeight(70)
                        .build())
                .setCar(Car.newBuilder()
                        .setBrand("쉐보레")
                        .setYear(2018)
                        .setColor("black")
                        .build())
                .build();

        showAllData(person.toString());

        
        person= Person.newBuilder(person).setEmail("change@naver.com").build();
        showAllData(person.toString());

* 어쨋든 중요한건 빌더를 받아서 다시 빌드 하는(?) 느낌인것같다

 ( 잘못 알고있다면, 댓글로 알려주시면 감사드리겠습니다.)


Send 

writeTo 의 함수의 문제점.

 

프로토콜 버퍼 메시지에는 메시지의 끝을 나타내는 내용이 없으므로 파일 끝에 도달할 때까지 메시지를 계속 시도합니다. writeDelimitedTo는 메시지의 시작 부분에 길이를 지정하므로 프로토콜 버퍼는 메시지의 길이를 정확히 알 수 있습니다

 

방법1

byte [] sendData = person.toByteArray();
String dataLog = "";

for ( byte data :  sendData){
    dataLog = dataLog +" "+data;
}


client_outputStream.write(sendData);
client_outputStream.flush();

 

방법2

person.writeDelimitedTo(client_outputStream);

 

아래 블로그를 꼼꼼히 읽어보자.

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=seban21&logNo=70153343429 

 

java(자바) google protobuf

  0. 들어가며 언제나 그렇듯 박스/굵은 글씨만 봐도 무관한 글입니다. 단, 좀 더 자세히 알...

blog.naver.com

 

728x90
반응형