2009-03-03 28 views
6

Tôi biết rằng một hàm tạo tham số riêng không hoạt động nhưng điều gì về một đối tượng không có các hàm tạo tham số?Có thể tuần tự hóa các đối tượng không có một hàm tạo parameterless trong WCF không?

Tôi muốn hiển thị các loại từ thư viện của bên thứ ba để tôi không kiểm soát được định nghĩa loại.

Nếu có cách nào dễ nhất? Ví dụ. Tôi không phải làm gì để tạo ra một loại phụ.

Edit:

Những gì tôi đang tìm kiếm là một cái gì đó như mức độ tuỳ biến đưa ra ở đây: http://msdn.microsoft.com/en-us/magazine/cc163902.aspx mặc dù tôi không muốn phải dùng đến con suối để serialize/deserialize.

Trả lời

5

Bạn có thể không thực sự làm cho các loại tùy ý serializable; trong một số trường hợp (ví dụ: XmlSerializer) thời gian chạy sẽ hiển thị các tùy chọn để giả mạo các thuộc tính. Nhưng DataContractSerializer không cho phép điều này.giải pháp khả thi:

  • ẩn các lớp học đằng sau các loại của riêng bạn mà serializable (rất nhiều công việc)
  • cung cấp những người đại diện Binary formatter (yeuch)
  • viết lõi serialization của riêng bạn (rất nhiều công việc để nhận được ngay)

về cơ bản, nếu có điều gì không là thiết kế cho serialization, rất ít của khuôn khổ này sẽ hãy bạn sắp xếp nó.

+0

Thật đáng tiếc, tôi muốn một cái gì đó giống như các phương pháp mở rộng nơi khung tìm kiếm một phương pháp mở rộng trên đối tượng và nếu nó tồn tại nó gọi nó là serialize/deserialize. –

+1

Khung thực sự không thể tìm kiếm các phương pháp mở rộng; chúng là một thủ thuật biên dịch. Nếu có nhiều, nó sẽ chọn gì? Những gì bạn mô tả là gần với người thay thế, nhưng đó vẫn còn rất nhiều công việc. –

+0

Vâng, tôi đoán bạn sẽ phải đăng ký triển khai của bạn bằng cách nào đó. Chỉ có rất nhiều móc vào WCF nếu chỉ có một cho serializing đó là đơn giản và mạnh mẽ (tức là không cần phải sở hữu các loại được serialized). –

1

Tôi không phải là chuyên gia WCF nhưng không chắc rằng họ hỗ trợ tuần tự hóa trên một nhà xây dựng với các loại tùy ý. Cụ thể là vì những gì họ sẽ vượt qua cho các giá trị? Bạn có thể vượt qua null cho các kiểu tham chiếu và các giá trị rỗng cho các cấu trúc. Nhưng loại nào tốt có thể được xây dựng với dữ liệu hoàn toàn trống?

Tôi nghĩ rằng bạn đang bị mắc kẹt với 1 trong tổng số 2 lựa chọn

  1. Sub lớp loại trong câu hỏi và vượt qua giá trị mặc định thích hợp để các nhà xây dựng không parameterless
  2. Tạo một loại tồn tại Chỉ duy nhất cho serialization. Sau khi hoàn thành nó có thể tạo ra một thể hiện của kiểu gốc mà bạn quan tâm. Nó là một cây cầu các loại.

Cá nhân tôi sẽ tham gia # 2. Làm cho lớp chỉ là cấu trúc dữ liệu và tối ưu hóa nó cho mục đích tuần tự hóa và nhà máy.

+0

Vấn đề với điều này là có rất nhiều loại trong thư viện và tôi sẽ phải ánh xạ tất cả các loại trên đó là những gì tôi đang làm bây giờ với một tập con của các loại trong thư viện của bên thứ ba. –

1

Tôi vừa chạy một thử nghiệm nhỏ, sử dụng Dịch vụ WCF trả về một đối tượng cơ bản không có hàm tạo mặc định.

//[DataContract] 
//[Serializable] 
public class MyObject 
{ 
    public MyObject(string _name) 
    { 
     Name = _name; 
    } 

    //[DataMember] 
    public string Name { get; set; } 

    //[DataMember] 
    public string Address { get; set; } 
} 

Dưới đây là những gì mà dịch vụ trông giống như:

public class MyService : IMyService 
{ 
    #region IMyService Members 

    public MyObject GetByName(string _name) 
    { 
     return new MyObject(_name) { Address = "Test Address" }; 
    } 

    #endregion 
} 

này thực sự hoạt động, miễn là MyObject hoặc là một [DataContract] hoặc [Serializable]. Thật thú vị, nó dường như không cần hàm tạo mặc định ở phía máy khách. Có một bài liên quan ở đây:

How does WCF deserialization instantiate objects without calling a constructor?

+0

Rất tiếc, các loại khung bên thứ ba không được đánh dấu là [DataContract] hoặc [Serializable]. –

+0

Điều này có nghĩa là chúng không được thiết kế để được sắp xếp theo thứ tự, vì vậy đừng tuần tự hóa chúng. –

+1

Bạn có thể viết đối tượng bộ điều hợp tuần tự kết thúc tốt đẹp các loại của bên thứ ba và chỉ tuần tự hóa các phần bạn cần. –

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