2011-12-02 4 views
6

protobuf-net의 v2에서 내 클래스가 ICollection, IEnumerable 등을 구현한다는 사실을 어떻게 무시할 수 있습니까?protobuf-net이 IEnumerable/ICollection 인터페이스를 무시하도록합니다.

이 시나리오에서는 필자가 [ProtoMember]로 표시된 필드 만 직렬화하도록하고 싶습니다.


현재 protobuf-net v1을 v2로 변환하는 중입니다. 나는 변화로 인해 지금 올바르게 직렬화되지 않는 특별한 구조를 가지고있다. 이 같이 보입니다 다음 더

"C:\h" 
└─── "appy.txt" 
└─── "istory.txt" 
처럼 뭔가 \ history.txt ":": \ happy.txt C ","C

[ProtoContract] 
public class FileTree : ICollection<FilePath>, IEnumerable<FilePath>, IEnumerable, INotifyCollectionChanged, INotifyPropertyChanged { 

    private FileTreeNode _Root; 

    [ProtoMember (1)] 
    public FileTreeNode Root { 
     get { return _Root; } 
     set { _Root = value; } 
    } 
} 

FileTree 클래스는 같은 파일 경로를 축소하기 위해 작성되었습니다

구조는 경로 문자열에서 중복을 제거합니다. 그래서 FileTree 클래스가 "C : \ happy.txt", "C : \ history.txt"등으로 저장되기 때문에 IEnumerable 함수를 통해 직렬화되기를 원하지 않습니다. 지금 바로 직렬화에서 FileTree 객체의 경우 각 경로가 전체적으로 인쇄됩니다.


편집 : 내가 언급해야 마지막 한가지 - 나는 [ProtoAfterDeserialization]와 태그가 FileTree에 On_Deserialization 기능을 가지고있다. 함수에 중단 점을 넣었지만 충돌이 없습니다. 이것은이 클래스가 직렬화되는 방식과 관련이 있습니까?

+0

저는 이것이 v1과 v2 사이의 급격한 변화라고 인식하지 못했습니다. 아마 미묘한 차이점은 v1이'IList '또는'IEnumerable '** ** ** public ** Add를 더 많이 찾고 있다는 것입니다. –

답변

7
[ProtoContract(IgnoreListHandling = true)] 
public class FileTree : ICollection<FilePath> ... 
{ ... } 

해야합니다. 나는 솔직히 목록에 콜백을 고려하지 않았다고 생각한다. 왜냐하면 그것들은 엔티티와 매우 다르게 처리되기 때문에, 그러나 작동해야하는 것은 위와 같다. 그렇지 않으면 알려주세요. IntelliSense를 문서에서

:

을 가져 오거나 이러한 유형이 익숙 목록과 같은 특성이있는 경우에도, 목록으로 처리되지 않는 것을 나타내는 값을 가져 오거나 설정은

(등, 열거 추가)
+0

감사합니다. 회신을 통해 그 대답이 너무 분명해 졌을 때 귀찮게해서 죄송합니다. 나는 그 대답을 위해 모든 잘못된 장소를보고 있었다. – Amanduh

+0

@Amanduh 대답을 알았을 때 대부분의 것들이 명백합니다. 이것은 좋은 질문이었습니다. 다행스럽게도 편리한 답을 얻었습니다. (상당히 최근까지는 없었습니다) –

+0

@MarcGravell IgnoreListHandling 옵션 약간 더 [복잡한] (https://code.google.com/p/protobuf-net/issues/detail?id=287&q=IgnoreListHandling) [시나리오] (https://code.google. com/p/protobuf-net/issues/detail? id = 348 & q = IgnoreListHandling). – tm1

관련 문제