【问题标题】:Type cannot be ISerializable and have DataContractAttribute attribute [duplicate]类型不能是 ISerializable 并且具有 DataContractAttribute 属性 [重复]
【发布时间】:2014-04-22 17:11:23
【问题描述】:

我收到了
Type 'WcfServiceLibrary1.GetDataErrorException' cannot be ISerializable and have DataContractAttribute attribute.

尝试在 WCF 服务中添加自定义异常时。

 [ServiceContract]
public interface IService1 {

    [OperationContract]
    [FaultContract(typeof(GetDataErrorException))]
    string GetData(int value);
}

public class Service1 : IService1 {
    public string GetData(int value) {
        if (value.Equals(0))
            throw new FaultException<GetDataError>(new GetDataError(), new FaultReason("Zero"));

        return string.Format("You entered: {0}", value);
    }
}

[DataContract]
public class GetDataError {
    public GetDataError() { }
}

[DataContract]
public class GetDataErrorException : FaultException<GetDataError> {
    public GetDataErrorException(string message) :
        base(new GetDataError(), new FaultReason(message)) { }
}

为什么这不起作用?我想我错过了一些简单的东西......

【问题讨论】:

  • FaultException 是否已经实现 ISerializable?然后它们会受到不同的序列化程序的影响吗?
  • FaultException 继承自标记为 Serializable 的 Exception。我认为这是一个与应用领域相关的设计决策。可能是错的。

标签: c# wcf faultexception faultcontract


【解决方案1】:

你不能也不应该两者兼得。从你得到的例外中可以明显看出这一点。框架在看到 2 个序列化程序时会看到模棱两可的状态。更多信息请参考以下博客

http://blogs.msdn.com/b/sowmy/archive/2006/05/14/597476.aspx

你的错误契约应该是这样的

public class DataErrorException : FaultException<GetDataError> 
{
    public DataErrorException(string message) :
            base(new GetDataError(), new FaultReason(message)) { }
}

注意这里唯一的变化是我删除了DataContract属性

【讨论】:

    【解决方案2】:

    我使用了msdn faultexception example 中的示例,这对我有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-03
      • 1970-01-01
      • 1970-01-01
      • 2011-01-03
      • 2017-04-07
      • 2014-05-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多