2013-06-18 2 views
1

기본 클래스의 하위 유형을 지정하지 직렬화에, 내가 수행해야합니다.protobuf - 순 나는 이와 같은 상속 체인을 가지고

RuntimeTypeModel.Default[typeof(Packet)].AddSubType(3, typeof(Message<PayloadType>)); 

나는 대답은 이런 종류의 (위의 라인을) 알고 꽤 StackOverflow의 게시물에 기록 된 다음 내가 필요하기 때문에 그러나, 나는이 디자인을 좋아하지 않는다 모든 하위 유형을 미리 선언하고 제한된 소수의 su를 의미합니다. btypes.

응용 프로그램에서 serialization/deserialization에 protobuf-net을 사용하여 메시지 버스를 코딩하려고합니다. 메시지 버스는 '이벤트'를 보내고 요청/응답에 응답해야합니다. 내 시스템에 많은 (쉽게> 100) 이벤트가 있기 때문에 RuntimeTypeModel에서 모든 닫힌 제네릭 형식에 대한 하위 형식을 선언하고 싶지 않습니다.

protobuf-net은 하위 유형/클래스를 추론 할 수 있습니까? 또는 이상적으로는 다음과 같은 것을 사용하고 싶습니다.

RuntimeTypeModel.Default[typeof(Packet)].AddSubType(3, typeof(Message<>)); 

(어느 것이고 작동하지 않습니다).

답변

2

protobuf 유선 형식으로 보낸 유일한 식별자는 숫자 키 (예 : 1,2,3)입니다. 데이터가 직렬화 된 후에는 앞으로 deserialize하기를 원할 것입니다. 키가 명시 적으로 지정되어 있지 않으면 신뢰할 수있는 방식으로 수행하는 것이 입니다. 상당히에 문제가 있습니다. 특히 이러한 하위 유형은 다른 어셈블리에서 선언 될 수 있으므로 반영을 통해 추론 할 수도 없습니다.

현재로서는 짧은 대답은 "반드시 지정해야합니다"입니다. "속성"에 대해서는 말하지 않았 음을 유의하십시오. 서브 타입은 런타임에 RuntimeTypeModel API를 통해 지정할 수도 있습니다 (더 편리하다면).

+0

빠른 알림을 보내 주신 Marc에게 감사드립니다. 그것이 내가 원하는 바가 아니지만, 그 형식이 유선 형식에 포함되어 있지 않다는 것을 이해합니다. 내 문제를 해결하기 위해 자동 등록을 할 것입니다 : 기본 클래스에서 상속 한 모든 유형에 대해 현재 AppDomain에서로드 된 어셈블리를 검사합니다. 키에 대해서는 항상 해시 코드를 사용할 수 있습니다. System.Type.Name. 이 게시물과 유사 : http://stackoverflow.com/questions/6702172/protobuf-net-v2-type-meta. – pdalbe01

+0

@ pdalbe01 그냥 각 유형에 대해 동일한 키를 가져올 수 있는지 확인하십시오. 이는 중요합니다. 반사는 사물이 발견되는 순서에 대해 거의 보장하지 않습니다. "알파벳"의 "명백한"선택은 사람들이 클래스를 추가/제거/이름을 변경함에 따라 까다로울 수 있으므로 키 번호를 각 유형과 어떻게 안정적으로 연관시키는 지 생각하는 것이 중요합니다. 파생 된 유형 *의 속성 *이 작업을 수행 할 수 있습니다. –

관련 문제