2011-12-02 29 views
6

Làm thế nào tôi có thể nhận được v2 của protobuf-net để bỏ qua thực tế là lớp của tôi thực hiện ICollection, IEnumerable, vv?Force protobuf-net để bỏ qua giao diện IEnumerable/ICollection

Đối với trường hợp cụ thể này, tôi chỉ muốn các trường tôi đã gắn cờ là [ProtoMember] sẽ được đăng.


Tôi hiện đang trong quá trình chuyển đổi từ sử dụng protobuf-net v1 sang sử dụng v2. Tôi có một cấu trúc đặc biệt mà bây giờ đang tuần tự hóa không đúng vì sự thay đổi. Nó trông giống như sau:

[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; } 
    } 
} 

Lớp FileTree được viết sụp đổ đường dẫn tập tin như "C: \ happy.txt" "C: \ history.txt" vào một cái gì đó giống như

"C:\h" 
└─── "appy.txt" 
└─── "istory.txt" 

Cấu trúc loại bỏ sự dư thừa trong chuỗi đường dẫn. Vì vậy, tôi thực sự không muốn lớp FileTree được serialized thông qua các chức năng IEnumerable bởi vì sau đó nó chỉ được lưu trữ như "C: \ happy.txt", "C: \ history.txt", vv Ngay bây giờ, trong serialization của đối tượng FileTree, mỗi đường dẫn sẽ được in đầy đủ.


EDIT: Một điều cuối cùng tôi nên đề cập - Tôi có một chức năng On_Deserialization trong FileTree được gắn thẻ với [ProtoAfterDeserialization]. Tôi đặt một điểm ngắt trong hàm, nhưng nó không bị tấn công. Điều này có liên quan đến cách lớp này đang được tuần tự hóa không?

+0

Tôi không * nhận thức * rằng đây là thay đổi đột phá giữa v1 và v2; có lẽ sự khác biệt tinh tế là v1 đã tìm kiếm nhiều hơn cho 'IList ', hoặc kết hợp của 'IEnumerable '** với ** một' Add' công khai. –

Trả lời

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

nên làm điều đó. Tôi thành thật không nghĩ rằng tôi đã được coi là callbacks trên danh sách, vì chúng được xử lý rất khác nhau với các thực thể, nhưng với những điều trên nên hoạt động. Hãy cho tôi biết nếu nó không.

Từ các tài liệu IntelliSense:

Gets hoặc thiết lập một giá trị chỉ ra rằng loại hình này không nên được coi là một danh sách, thậm chí nếu nó có những đặc điểm danh sách giống như quen thuộc (đếm được, bổ sung, vv)

+0

Cảm ơn bạn! Xin lỗi vì đã làm phiền bạn với câu trả lời này khi câu trả lời rất hiển nhiên khi nhìn lại. Tôi đang tìm kiếm tất cả các địa điểm sai cho câu trả lời. – Amanduh

+0

@Amanduh hầu hết mọi thứ là hiển nhiên khi bạn biết câu trả lời, tuy nhiên - đây là một câu hỏi hay và hợp lệ, may mắn xảy ra * có * một câu trả lời thuận tiện (cho đến gần đây) –

+0

@MarcGravell Lưu ý rằng tùy chọn IgnoreListHandling có thể không hoạt động như mong đợi trong một chút [phức tạp] (https://code.google.com/p/protobuf-net/issues/detail?id=287&q=IgnoreListHandling) [scenario] (https://code.google. com/p/protobuf-net/issues/detail? id = 348 & q = IgnoreListHandling). – tm1

Các vấn đề liên quan