2011-11-21 2 views
2

우리는 wpf를 사용하고 있으며 뷰 모델 인 복잡한 객체를 직렬화하려고합니다.복잡한 객체에 Protobuf-net을 사용하는 방법은 무엇입니까?

바이너리 포맷터를 사용하면 [Serializable] 속성을 추가 할 수 있으며 자동으로 전체 클래스에서 반복적으로 작동합니다.

우리는 protobuf에서 비슷한 것을 가지고 있습니까?

또한 문서는 어디에 있습니까?

나는 protoinclude와 protomembers에 대해 알았지 만, 이것들은 변경 될 수있는 복잡한 객체입니다.

protobuf는 작고 빠르며 휴대가 편리하기 때문에 사용하고 싶습니다. 그러나 나는 다른 옵션을 배제하지 않습니다. 같은 목표를 달성한다면 다소간 사용할 수 있고 사용하기 쉽습니다. 옵션에 답하거나 제안하십시오. 감사합니다.

답변

2

BinaryFormatter은 출력에 필드 이름을 포함하여이를 관리합니다 (예 : 필드 + 속성에서 자동으로 구현 된 속성으로 변경하는 것을 견딜 수 없음). 당신이 protobuf - 그물에 비슷한 일을하려면

, 당신은 당신의 모델이 완전히로 고정되어있는 경우 너무에만 적합합니다, 이것은 각 구성원 정수 키를 할당 있습니다, 그러나, "ImplicitFields"를 사용할 수 있습니다 계약을 체결하고 멤버를 추가/이름 변경하지 않으므로 계약이 파손됩니다 (기존 데이터를 올바르게 직렬화 할 수 없음). 예를 들어 계약이 완전히 해결되지 않은 경우

[ProtoContract(ImplicitFields = ImplicitFields.AllPublic)] 
public class Foo {...} // all public fields and properties are serialized, 
         // similar to XmlSerializer 

[ProtoContract(ImplicitFields = ImplicitFields.AllFields)] 
public class Bar {...} // all fields (not properties; public or private) 
         // are serialized, similar to BinaryFormatter 

, 명시 적으로 a great many ways에서 수행 할 수있는 각 직렬화 된 회원에 키를 할당하는 것이 바람직 할 것이다. 가장 단순한 것 :

[ProtoContract] 
public class Foo { 
    [ProtoMember(1)] 
    public int A {get;set;} 

    ... 
} 
+0

많은 감사. 우리는 메모리에 객체를 전달하고 있으며 단일 버전 만 기대합니다. 우리는 작은 크기와 속도를 위해 protobuf를 원합니다. 나는 오늘 나중에 이것을 시도 할 것이고, 속성은 내부의 하위 유형을 "발견"하고 그것들을 포함시킬 수있을 것인가? – kobi7

+0

@ 토양보다 우수; 잠재적 인 하위 유형을 해결하고 키를 지정하는 강력한 방법이 필요하기 때문에 현재 서브 유형을 명시 적으로 지정해야합니다. 원하는 경우 런타임에서이를 제어 할 수 있습니다 (* 코드 *가 하위 유형을 안정적으로 찾을 수있는 경우). 속성을 반드시 사용할 필요는 없습니다. –

+0

마크, protobuf-net-AsReference 대 BinaryFormatter의 다른 차이점에 관한 뉴스? 나는 당신이 null 대 빈 컬렉션 (위대한!)에 대한 작업을 한 것을 보았습니다. 컬렉션을 복제 한 후에 아이템이 참조 평등이 될 수있는 컬렉션을 볼 시간이 있었습니까? 그렇지 않으면 implicitfields를 사용하여 binaryformatter 대신 pbnet을 사용하려고 시도하기 전에 @ better-than-soil이 그 차이를 알아야한다고 생각합니다. –

관련 문제