메시지 직렬화에 protobuf-net (버전 2.0.0.480)을 사용중인 시스템에서 작업했습니다. 이 응용 프로그램은 명령과 이벤트가 다른 네임 스페이스 [및 어셈블리]로 분리 된 CQRS 방식을 사용합니다.Protobuf-net을 사용하여 여러 네임 스페이스의 직렬화
코드는 런타임시 MessageBase에서 상속하는 모든 클래스에 동적으로 유형을 추가합니다.
// Used as a unique reference for each type in a member
private static int _sequence = 1000;
public static void RegisterAll()
{
RegisterAllDerivedFrom<MessageBase>();
}
public static void RegisterAllDerivedFrom<T>(params Assembly[] assemblies)
{
if (assemblies == null || assemblies.Length == 0)
{
assemblies = AppDomain.CurrentDomain.GetAssemblies();
}
var type = typeof(T);
var model = RuntimeTypeModel.Default;
var metaModel = model.Add(type, true);
RegisterAllBaseTypes(type, metaModel, model, assemblies);
}
private static void RegisterAllBaseTypes(Type type, MetaType metaModel, RuntimeTypeModel model, params Assembly[] assemblies)
{
foreach (var t in assemblies.SelectMany(a => a.GetTypes().Where(t => t.BaseType != null && t.BaseType == type)))
{
var subModel = model.Add(t, true);
metaModel.AddSubType(_sequence, t);
_sequence++;
RegisterAllBaseTypes(t, subModel, model, assemblies);
}
}
몇 가지 유형뿐만 아니라 기본 RuntimeTypeModel에 수동으로 추가됩니다 :
RuntimeTypeModel.Default.Add(typeof(ReferenceNumber), true)
.AddSubType(100, typeof(Product))
.AddSubType(110, typeof(ProductGroup));
모두 위의 모든 메시지에있을 때 잘 작동하는 것 같습니다 : 이것은 아래의 코드를 사용하여 수행됩니다
LogicalGrouping.Events
이 프로젝트는 forw 이동 ARD와 새로운 네임 스페이스가 추가되었습니다
ReferenceGrouping.Commands
을 ReferenceGrouping.Commands 추가하고 ProtoException가 발생 메시지를 보내려고하면. 이 동작을 발견 한 유일한 해결 방법은 ReferenceGrouping.Commands에서 LogicalGrouping.Events의 명령을 추가하는 것입니다.
예상되는 동작입니까? RuntimeTypeModel이 완전히 다른 네임 스페이스에서 추가되는 클래스를 지원할 수 있습니까?
"DynamicType"옵션을 사용하지 않는 한 protobuf-net은 네임 스페이스 *에 대해 신경 쓰지 않습니다. 형식 이름, 어셈블리 이름 또는 필드 이름이 저장된 데이터에 없습니다. ProtoException의 전체 정보는 무엇입니까? –
아 ... 궁금합니다 ... 2 초 –