2012-02-11 3 views
2

우리는 protobuf-net을 사용하고 있습니다 (그리고 그것을 좋아합니다!). 우리는 이제 부모 기본 클래스에서 파생 된 protocontract 장식 하위 클래스를 갖습니다.Protobuf-net은 비 직렬화 가능한 기본 클래스의 특정 멤버를 포함합니다

우리는 자식 클래스가 부모 클래스의 필드 중 일부를 직렬화/비 직렬화하도록하려고합니다.

public abstract class TableServiceEntity 
{ 
    public virtual string PartitionKey { get; set; } 
    public virtual string RowKey { get; set; } 
    public DateTime Timestamp { get; set; } 
} 

[ProtoContract] 
public class IndicatorStreamIndex : TableServiceEntity 
{ 
    // protomember properties 
} 

우리가 어떻게 IndicatorStreamIndex가에 PartitionKey, RowKey 및 타임 스탬프를 역 직렬화/직렬화받을 수 있나요?

보다도,

+0

잠시 후에 몇 가지 시도해 보겠습니다 ... –

+0

마크, 감사합니다! 귀하의 회신을 기대하겠습니다. – ionwarp

+0

당신은 protobuf-net의 어떤 버전을 사용하고 있습니까? 다른 기능을 사용할 수 있습니다. –

답변

2

이 런타임에 구성을 조정할 RuntimeTypeModel를 사용하여, V2에서 아주 쉽게 구성 할 수 있습니다 마이크 :

// this should only be done once per AppDomain, usually at app startup 
RuntimeTypeModel.Default.Add(typeof (IndicatorStreamIndex), true) 
    .Add("PartitionKey", "RowKey", "Timestamp"); 

// then when needed: 
var obj = new IndicatorStreamIndex 
{ 
    RowKey = "abc", 
    PartitionKey = "def", 
    Timestamp = DateTime.Today 
}; 
var clone = Serializer.DeepClone(obj); 
Console.WriteLine(clone.RowKey); // "abc" 
Console.WriteLine(clone.PartitionKey); // "def" 
Console.WriteLine(clone.Timestamp); // 13/02/2012 
+0

마크, 고마워요! 곧이를 구현하고 어떻게 진행되는지 알려줄 것입니다. – ionwarp

2

첫째 - 난 당신이를 개발할 수있는 기술적 기반을 가지고 있다고 생각 뛰어난 시리얼 라이저. 즉, ProtoBuf 직렬화의 다양한 측면이 너무 비현실적이어서 현재 상황에서 사용할 수 없다는 것을 알게되었습니다.

하자 - 먼저 클래스에 ProtoBuf 특성을 직렬화하도록 명시 적으로 지정해야하므로 ProtoBuf 배포 종속성이 필요합니다. 직렬화에 대한 기본 아이디어 중 하나는 같은 클래스를 사용하고 필요한 경우 serializer를 스왑 할 수 있다는 것입니다. 즉, 특성 및 dll이 다른 배포에 필요하지 않을 수 있습니다.

두 번째 off - with ProherBuf는 기본적으로 상속 트리를 재귀하지 않고 더욱 더 Protobuf를 만듭니다. 즉, 코드가 더 복잡해지며 더 구체적인 코드 의존성이 생기는 것을 의미합니다. 이것은 내 의견에 매우 분명한 결함입니다. B를 A에서 제외하면, 위의 스레드에 표시된대로 사용자 정의 코드없이 B를 직렬화 할 때 A 속성이 자연스럽게 포함되기를 원합니다.

세 번째로 - 특성을 사용할 필요가 없다는 것을 스스로 확인하십시오. 그러면 개체에서 일련 번호를 붙이는 등 자신을 그림으로 그릴 수 있습니다. object [] 매개 변수 - ProtoBuf가 현재 수행 할 수없는 매개 변수입니다. 나는 직렬화 전문가가 아니기 때문에 클래스와 어셈블리를 직렬화 된 객체의 일부로 단순하게 배치하여 원격으로 해결할 수 있다고 생각한다. 동일한 라이브러리가 거기에 있어야한다는 것을 명심해야한다. 즉, 이름과 어셈블리별로 동일한 유형이 원격 시스템에 존재한다는 가정에 따라 명시 적 속성없이 모든 유형/유형 계층 구조를 직렬화하는 기능입니다.

마크, 구현과 관련하여 행운을 빕니다.

가우이

+0

내가 잘못보고있는 것 같아서 ... 회상 해보면 닷넷 기능이 풍부한 serialization SDK보다는 inter-language 통신 도구가 더 많을 것이다. – user1210708

관련 문제