2010-02-16 2 views
4

하나의 어셈블리에는 기본 클래스가 있고 기본 클래스를 상속받은 다른 클래스에는 다수의 생성 된 클래스가 있습니다. 하위 클래스가 기본 클래스의 어셈블리에 없기 때문에 prototype-net (r282)을 사용하여 기본 유형의 목록을 직렬화하지 못하면 subclassType (SerializerT.cs의 248 행)을 해결할 수 없습니다. 클래스를 함께 이동하는 것이 바람직한 옵션이 아니며 List를 전달할 수있는 것이 중요합니다.protobuf-net [de] 어셈블리 경계를 통해 직렬화

내 태그가 지정된 기본 클래스입니다. 포함 된 유형은 필요에 따라 ProtoMember(x)으로 표시됩니다. 보조 노트로

[ProtoContract] 
[ProtoInclude(1,"SomeItemType")] 
[ProtoInclude(2,"AnotherItemType")] 
[ProtoInclude(190,"YetAnotherItemType")] 
public abstract class BaseItem 
{ 
} 

이 데스크톱 응용 프로그램과는 SOAP 웹 서비스간에 데이터를 이동하는 경우 BinaryFormatter를 대체 할 protobuf - 그물을 사용하여 평가의 일부입니다.

이런 종류의 작업을 수행 할 수 있습니까? 더 좋은 방법이 있습니까? 나는 명백한 무엇인가 놓치고 있냐? 별도의 장기적인 질문은 3.5 로의 최종 이동을 준비하기 위해 제가 약간 다른 것을해야만합니까?

[ProtoInclude(1, typeof(SomeItemType))] 

이 또한 그냥 조립 자격을 갖춘 이름을 사용할 수 있도록, : :이 자동으로 뉘앙스를 많이 취급하기 때문에 ProtoInclude를 사용하는

답변

1

아마도 가장 쉬운 방법은, typeof 함께

[ProtoInclude(1,"SomeItemType, SomeRandomAssembly")] 

여러 개의 AppDomain이 포함 된 매우 독특한 경우에 나는 AppDomain.TypeResolve 이벤트로 일부 마법을 쓸 수 있음을 발견했지만 가능하면 피해야합니다. 또한 파이프 라인에서 메타 데이터 레이어를 완전히 다시 작업 할 수 있으므로 런타임시 훨씬 더 많은 유연성을 허용합니다 (컴파일시 모든 것을 선언 할 필요없이 위의 고통을 유발할 수 있음).

+0

감사합니다. 마크, 내가 찾고있는 것. 전체 어셈블리로 정규화 된 이름을 사용하는 것이 트릭을 만들었습니다. 내 SomeItemType은 기본 클래스에서 사용할 수 없기 때문에 typeof (SomeItemType)는이 경우 작동하지 않습니다. 다시 한번 감사드립니다. – tsupe

관련 문제