자바에서는 immutable POJO의 계층 구조를 사용하여 도메인 모델을 표현하고자합니다.불변의 비즈니스 객체와 MessagePack 메시지 사이의 자동 변환
final ServiceId id = new ServiceId(ServiceType.Foo, "my-foo-service")
final ServiceConfig cfg = new ServiceConfig("localhost", 8080, "abc", JvmConfig.DEFAULT)
final ServiceInfo info = new ServiceInfo(id, cfg)
이러한 POJO에는 모두 getter 또는 setter가없는 공개 최종 입력란이 있습니다. (getter의 팬이라면, 게터로 필드가 비공식적 인 것으로 가정하십시오)
MessagePack 라이브러리를 사용하여 이러한 객체를 직렬화하여 네트워크를 통해 전달하고 ZooKeeper에 저장하고 싶습니다. 노드 등.
문제는 MessagePack이 공개 필드, 비 최종 필드의 직렬화 만 지원하므로 비즈니스 객체를있는 그대로 직렬화 할 수 없다는 점입니다.
또한 MessagePack은
(당신은. 당신의 enum
을 지원하지 않으므로 직렬화를 위해 enum 값을
int
또는
String
으로 변환해야합니다.
enum
들에 주석을 추가하려면 아래 내 코멘트를 참조하면 네, 그것은, 않습니다.)
이 처리하기 위해 내가 각 Business Object 사이의 변환에, "메시지"개체의 손으로 쓴 해당 계층 구조를 가지고 및 해당 메시지 객체. 분명히 이것은 많은 양의 중복 된 코드를 유발하고 사람의 실수로 필드가 누락 될 수 있기 때문에 이상적이지 않습니다.
이 문제에 대한 더 좋은 해결책이 있습니까?
- 컴파일 타임에 코드가 생성됩니까?
- 런타임시 적절한 직렬화 가능 클래스를 생성하는 몇 가지 방법은 무엇입니까?
- MessagePack에서 포기 하시겠습니까?
- 불변의 것을 포기하고 내 비즈니스 개체에
enum
을 지정 하시겠습니까? - 변경할 수있는 객체 (메시지 객체)를 변경할 수없는 객체 (비즈니스 객체)로 래핑 할 수있는 일반 래퍼 라이브러리가 있습니까? 나는 자동으로 가까이 솔루션에 저를 얻을 수있는 자바 빈,로/불변의 객체를 변환 할 수 있습니다, 그래서 만약
는 MessagePack 또한, 자바 콩의 직렬화합니다 (@MessagePackBeans 주석을 사용하여)를 지원합니다.
[@OrdinalEnum] (https://github.com/msgpack/msgpack-java/blob/master/src/main)을 추가하면 MessagePack이 'enum'유형을 지원할 수 있다는 것을 시행 착오를 통해 발견했습니다. /java/org/msgpack/annotation/OrdinalEnum.java) 주석을 모든 열거 형에 적용합니다. @Delegate 주석이하는 일을 해결하기 위해 이제 ... –