2009-04-10 26 views
6

Ok vì vậy tôi đã nhận DataContractSerializer làm việc với biểu đồ đối tượng của mình. Xem các câu hỏi trước của tôi để biết thêm thông tin.RuntimeType: http: //schemas.datacontract.org/2004/07/System 'không được mong đợi

Serialization/Derialization of a tree structure

The deserializer has no knowlege of any type that maps to this contract

Tuy nhiên, một trong những lĩnh vực của tôi, _UserPropertyDefinitions, được định nghĩa như hình dưới đây .. Nó định nghĩa một danh sách các thuộc tính tùy chỉnh mà người dùng này có thể thêm vào các đối tượng trong cấu trúc dữ liệu . Chuỗi là một khóa duy nhất để xác định thuộc tính và Loại là loại thuộc tính luôn là loại nguyên thủy như Bool, Int, String, v.v.

Mỗi đối tượng có một từ tương ứng Dictionary (Chuỗi khóa, giá trị đối tượng) bộ sưu tập để lưu trữ các giá trị nó đã đặt ra cho bất kỳ "Properties tài"

[DataMember] 
private Dictionary<string, Type> _UserPropertyDefinitions; 

đồ thị đối tượng của tôi serializes tốt khi khách sạn này là một bộ sưu tập sản phẩm nào, nhưng khi tôi thêm một tài sản tùy chỉnh bộ sưu tập này Tôi nhận được ngoại lệ sau khi cố gắng serialize với DataContractSerializer.

Loại 'System.RuntimeType' với dữ liệu hợp đồng tên 'RuntimeType: http://schemas.datacontract.org/2004/07/System' không được mong đợi. Thêm bất kỳ loại nào không phải là được biết đến tĩnh vào danh sách các loại đã biết - ví dụ: bằng cách sử dụng thuộc tính KnownTypeAttribute hoặc thêm chúng vào danh sách các loại đã biết được chuyển đến DataContractSerializer.

Nếu tôi xóa thuộc tính DataMember cho trường này, tôi có thể tuần tự hóa/deserialize với ngoại lệ, nhưng tất nhiên tôi mất cài đặt tôi đã tạo trong trường này.

+1

Xin lỗi vì trả lời chậm ;-p Hoặc Type.GetType() hoặc Assembly.GetType() –

Trả lời

7

Tôi khá chắc chắn rằng Type sẽ không tuần tự hóa tốt - và cho là nó không thuộc về hợp đồng dữ liệu, vì (đang được triển khai cụ thể) nó đánh bại một trong những mục tiêu chính của dữ liệu -contract ...

Tuy nhiên, tôi hy vọng cách tiếp cận tốt nhất sẽ là trao đổi điều đó cho một số Dictionary<string,string>, sử dụng số AssemblyQualifiedName hoặc FullName của Type.

+0

Geeze Marc bạn không có bất kỳ công việc thực sự nào để làm? :-) Nhưng nghiêm túc tôi thực sự đánh giá cao sự giúp đỡ. Vì vậy, về cơ bản tôi muốn lưu trữ tên của các loại, và sau đó lấy các loại thực từ tên? Tôi biết cách tìm tên của Loại, nhưng làm cách nào để truy xuất Loại sau khi tôi chỉ biết tên? –

+0

@Marc Gravell làm thế nào bạn sẽ lấy loại khi bạn chỉ có tên nếu nó không phải là một loại hình làm việc được biết đến trang trại, bạn cũng sẽ gửi toàn bộ một số lắp ráp như thế nào? –

+0

@ tốt, một AssemblyQualifiedName không phải là "chỉ" một cái tên, nhưng có nó là vấn đề, đặc biệt là nếu các hội đồng khác nhau. Nếu hai việc triển khai có thể phân loại các loại đã biết của chúng, có lẽ một enum sẽ đủ? Trong protobuf-net, cho serialising Type I cho phép người dùng cung cấp một triển khai cho loại <==> chuỗi, để họ có thể ánh xạ nó theo cách thủ công. –

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