2013-05-21 4 views
2

런타임 중에 또는 적어도 모델 초기화 중에 일부 내장 유형 (예 : DateTime)에 대해 다른 직렬화 방법을 전환해야합니다. 이 작업을 수행하는 가장 좋은 방법은 무엇입니까? 사용자 지정 모델 (RuntimeTypeModel.Add(typeof(DateTime), false).SetSurrogate(typeof(uint)))을 사용하여 서로 게이트를 시도했지만 "이 형식의 데이터에는 inbuilt 동작이 있으며 모델에 추가 할 수 없습니다."오류가 발생했습니다.inbuilt 유형의 직렬화 메소드 대체하기

답변

2

나는 솔직히 말해서 내가 대단히 생각한 시나리오는 아니다. 대부분의 "inbuilt behavior"유형의 경우 구현을 변경하는 것이 실제로 매우 바람직하지 않을 것입니다. 왜냐하면 구현이 특정 protobuf의 일부이기 때문입니다. 그러나 DateTime의 경우 TimeSpan, DecimalGuid이 지원 될 수있는 대체 레이아웃이있을 수 있습니다. 내가 여기서하고 싶은 것이 정확히 무엇인지 물어봐도 될까요? 그것을하는 더 좋은 방법이있을 수 있기 때문에. 똑같이 중요한 것은 : 크기는 얼마입니까? 그냥 몇 가지 경우를 경우, 다음 심 속성은 예를 들어, 바람직 할 수 있습니다

public DateTime When {get;set;} 
[ProtoMember(4)] 
private uint WhenSerialized { 
    get { return YourConverter.FromDateTime(When); } 
    set { When = YourConverter.ToDateTime(value); } 
} 

그것은 또한 가능 할 수있다 이러한 유형의 처리 "대리"를 사용하려면,하지만 당신은에 대리를 사용할 수 없습니다 uint으로 직접 연결하십시오. struct 또는 class, uint 인 대리인을 사용할 수 있습니다.

+0

나는 설명하려고 노력할 것이다. 우리는 두 종류의 protobuf 스트림 소스를 가지고 있습니다 : 임베디드 장치와 SQL 데이터베이스. DateTime의 UInt32 형식 (1980.1.1에서 초 수)을 사용하는 내장 장치, 기본 protobuf-net 형식을 사용하는 데이터베이스 둘 다 처리 할 객체가 하나 필요하므로 shim 속성이 작동하지 않습니다. 또한 우리는 DateTime 속성을 가진 많은 protobuf 구조체를 가지고 있으며 너무 많은 바람직하지 않은 상용구 코드를 제공합니다. – GromHellscream

+0

@GromHellscream 당신은 분명히 할 수 있습니다 : 임베디드 장치에서 'uint'로 정의 된 속성입니까? 또는 'DateTime'으로? –

+0

임베디드 장치에서 'uint'로 정의되었습니다. – GromHellscream

관련 문제