2010-03-17 8 views
10

Tôi có một lớp mà tôi cần để có thể tuần tự hóa thành một biến phiên SQLServer và có sẵn trên một dịch vụ WCF. Tôi đã tuyên bố nó như sauTại sao tôi không thể sử dụng WCF DataContract và ISerializable trên cùng một lớp?

namespace MyNM 
{ 
[Serializable] 
[DataContract(Name = "Foo", Namespace = "http://www.mydomain.co.uk")] 

public class Foo : IEntity, ISafeCopy<Foo> 
{ 
    [DataMember(Order = 0)] 
    public virtual Guid Id { get; set; } 

    [DataMember(Order = 1)] 
    public virtual string a { get; set; } 

    DataMember(Order = 2)] 
    public virtual Bar c { get; set; } 

    /* ISafeCopy implementation */ 
} 


[Serializable] 
[DataContract(Name = "Bar ", Namespace = "http://www.mydomain.co.uk")] 
public class Bar : IEntity, ISafeCopy<Bar> 
{ 
    #region Implementation of IEntity 

    DataMember(Order = 0)] 
    public virtual Guid Id { get; set; } 
    [DataMember(Order = 1)] 
    public virtual Baz y { get; set; } 

    #endregion 

    /* ISafeCopy implementation*/ 
} 


[Serializable] 
[DataContract] 
public enum Baz 
{ 
    [EnumMember(Value = "one")] 
    one, 
    [EnumMember(Value = "two")] 
    two, 
    [EnumMember(Value = "three")] 
    three 
} 

Nhưng khi tôi thử và gọi dịch vụ này, tôi nhận được lỗi sau trong nhật ký theo dõi.

"System.Runtime.Serialization.InvalidDataContractException: Loại 'BarProxybcb100e8617f40ceaa832fe4bb94533c' không thể ISerializable và có DataContractAttribute thuộc tính."

Nếu tôi lấy ra thuộc tính Serializable, dịch vụ WCF hoạt động, nhưng khi đối tượng không thể được nối tiếp thành phiên. Nếu tôi loại bỏ các thuộc tính DataContract từ lớp Bar, các dịch vụ WCF thất bại nói

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

Tôi đã thử thêm thuộc tính KnownType cho lớp foo

[KnownType(typeof(Bar))] 

Nhưng tôi vẫn gặp lỗi tương tự.

Có ai có thể giúp tôi với điều này không?

Rất cám ơn

Dave

Trả lời

8

Câu hỏi này trên MSDN có thể giúp: DataContract versus Serializable.

Câu trả lời được chấp nhận từ chủ đề đó:

  1. [DataContract][Serializable] có thể được sử dụng cùng nhau.

  2. DataContractSerializer hiểu cả hai. Nếu loại được đánh dấu bằng cả trong số họ, nó sẽ mất chiếu của [DataContract]

  3. Dưới đây là các tài liệu về chuyển giao dữ liệu và serialization trong WCF cung cấp rất nhiều chi tiết trên serializers và gõ tiếng: Data Transfer and Serialization

+0

Xin cảm ơn, tôi sẽ đọc ngay bây giờ. – Dave

+0

Cảm ơn - cuối cùng, những gì tôi đã làm là tạo bản sao của các lớp học của tôi và trả lại cho họ qua dịch vụ. – Dave

+2

sẽ là tốt đẹp để có câu trả lời thực tế ở đây, chứ không phải là một liên kết như các diễn đàn hiện đang xuống để bảo trì ... –

0

Tôi đã gặp phải vấn đề tương tự với việc tuần tự hóa đối với các khung thực thể pocos trên wcf. Không có gì đang hoạt động và tôi sắp bỏ cuộc khi tôi thử xóa các thẻ ảo khỏi các thành viên. Đột nhiên nó bắt đầu hoạt động. Hãy thử một lần.

1

Tôi biết điều này là rất muộn, nhưng trong trường hợp bất cứ ai đọc điều này, chúng tôi đã có một vấn đề tương tự. Giải pháp của chúng tôi để rời khỏi DataContract như vậy là WCF tuần tự hóa tốt, và sau đó khi chúng tôi tuần tự hóa cho phiên SQL Server, chúng tôi đã tuần tự hóa đối tượng đó thành JSON và viết cho phiên đó.