2011-10-03 12 views
5

Đi về với nhiệm vụ của tôi để uốn cong protobuf-net ý muốn của riêng tôi ..Hạn chế protobuf-net thừa kế "cây"

Tôi đã nhìn thấy một vài câu hỏi xung quanh SO về cách thêm sub-lớp động cho bộ nối tiếp để có thể mã hóa lớp con .., như this hoặc this

Tình trạng của tôi hơi khác một chút, tôi có một lớp cơ sở có thể được phân loại vào mã bị giới hạn muộn và tôi muốn tuần tự hóa là lớp BASE và hoàn toàn bỏ qua các trường/thuộc tính của lớp con. Lý do tôi cần điều này, là sau này, khi tôi deserialize dữ liệu, mã của lớp phụ sẽ không có sẵn, vì vậy việc xây dựng lớp con sẽ không thể thực hiện được nữa.

Có cách nào để giới hạn/cấm phân cấp theo lớp phụ không?

Trong trường hợp của tôi, tôi có Danh sách trong đó một số mục trong danh sách là DerivedClass.

Tôi muốn tìm một cách để làm protobuf-net serialize tất cả mọi thứ như BaseClass và deserialize đến BaseClass cũng ...

tôi đã cố gắng nhìn chăm chú vào mã, nhưng đã không tìm thấy một cái gì đó quá hữu ích .

Trả lời

2

Thông thường, thư viện rất cụ thể về việc phát hiện các lớp dẫn xuất - và xử lý chúng khác với lớp cơ sở. Chỉ hiện tại ngoại lệ cho rằng đó là các lớp proxy, trong khung Entity cụ thể và NHibernate. Đối với giải pháp gọn gàng, có vẻ như thực tế để thêm loại chuyển đổi "bỏ qua lớp con". Nhưng trong khi đó không tồn tại, một rất lười (và hacky) cách tiếp cận sẽ được để lừa bằng cách sử dụng hiện xử lý cho NHibernate, ví dụ:

namespace NHibernate.Proxy { 
    interface INHibernateProxy {} 
} 
... 
public class SomeDerivedType : BaseType, INHibernateProxy {} 

này sau đó sẽ tự động được tuần tự theo BaseType. Mặc dù vậy, nó có một chút ngớ ngẩn gian lận về nó.

+0

Ngất xỉu bạn nói? ;) Tôi nghĩ rằng tôi sẽ hack vào nguồn Coe nhưng cảm ơn cho đề nghị – damageboy

+1

@damageboy nếu bạn muốn thêm một số cơ chế tùy chỉnh cho điều này, 'TypeModel.ResolveProxies' sẽ có giá trị xem xét. Tôi không chống lại việc thêm một API cụ thể protobuf-net ở đây. –

+0

Vì vậy, chúng tôi đang ở trong đây rõ ràng ... Lý do bạn đang chỉ cho tôi đối với ResolveProxies là bởi vì nó được gọi là từ ThrowUnexpectedSubtype như là phương sách cuối cùng trước khi ném ngoại lệ? – damageboy