2011-02-05 49 views
2

我写了一个自定义的异常对象。这是因为我想在发生错误时跟踪附加信息。我的CLR对象的定义如下:错误序列化CLR对象以用于WCF服务

public class MyException : Exception 
{ 
    public override string StackTrace 
    { 
    get { return base.StackTrace; } 
    } 
    private readonly string stackTrace; 

    public override string Message 
    { 
    get { return base.Message; } 
    } 
    private readonly string message; 

    public string Element 
    { 
    get { return element; } 
    } 
    private readonly string element; 

    public string ErrorType 
    { 
    get { return errorType; } 
    } 
    private readonly string errorType; 

    public string Misc 
    { 
    get { return misc; } 
    } 
    private readonly string misc; 

    #endregion Properties 

    #region Constructors 

    public MyException() 
    {} 

    public MyException(string message) : base(message) 
    { } 

    public MyException(string message, Exception inner) : base(message, inner) 
    { } 

    public MyException(string message, string stackTrace) : base() 
    { 
    this.message = message; 
    this.stackTrace = stackTrace; 
    } 

    public MyException(string message, string stackTrace, string element, string errorType, string misc) : base() 
    { 
    this.message = message; 
    this.stackTrace = stackTrace; 
    this.element = element; 
    this.errorType = errorType; 
    this.misc = misc; 
    } 

    protected MyException(SerializationInfo info, StreamingContext context) : base(info, context) 
    { 
    element = info.GetString("element"); 
    errorType = info.GetString("errorType"); 
    misc = info.GetString("misc"); 
    } 

    public override void GetObjectData(SerializationInfo info, StreamingContext context) 
    { 
    base.GetObjectData(info, context); 
    info.AddValue("element", element); 
    info.AddValue("errorType", errorType); 
    info.AddValue("misc", misc); 
    } 
} 

我已经在WP7应用程序中创建这个定制xception的副本。唯一的区别是,我没有定义GetObjectData方法或定义了SerializationInfo的构造函数。如果我按原样运行应用程序,则会收到一条错误消息:

类型'My.MyException'无法序列化。考虑使用DataContractAttribute属性标记它,并使用DataMemberAttribute属性标记要序列化的所有成员。如果类型是一个集合,请考虑使用CollectionDataContractAttribute来标记它。

如果我添加了DataContract /的DataMember属性的类和服务器端的相应的成员,我收到一个错误,指出: 类型不能ISerializable的和具有DataContractAttribute属性。

如何序列化MyException,以便我可以将它的实例传递给我的WCF服务。请注意,我想使用我的服务从Android应用程序。正因为如此,我不想做任何过于以微软为中心的事情。这是我对DataContract/DataMember的担心。

非常感谢您的帮助!

回答

0

DataMember等没有任何可怕的东西;它们很好地转化为标准的SOAP概念。但例外情况如此。对于纯粹的WCF,你应该考虑faults而不是原始异常,但在一般的情况下,我将返回(作为我的操作结果)一个对象,该对象可选地包含有关预期故障的信息。应该在服务器上留下意外的故障,并返回一个通用的“oops”结果。

例如,你可以简单地碰到这样的:

[DataContract] 
public class FooResult { 
    [DataMember] 
    public string Error {get;set;} 
    [DataMember] 
    public SomeType Result {get;set;} 
} 

是主叫应该期待一个Error XOR一个Result。还要注意,如果没有DataContract/DataMember属性,序列化程序可能会作为字段序列化程序,这是您真正不想要的。

+0

我试图序列化异常的原因是因为我传递一个异常到WCF服务。原因是因为我正在捕获移动应用程序中发生的异常,并且想将它们登录到我的服务器上,所以我知道在哪里寻找错误。据说,我该怎么做? – user208662 2011-02-05 17:10:02

+0

为什么不改用“ex.ToString()”? – 2011-02-05 17:12:47

2

您需要将[Serializable]添加到您的自定义班。这是你的第一个错误很有可能告诉你,这个东西需要是可序列化的,尽管它告诉你使用首选的WCF(使用DataContract)。

您不能混合序列化接口(DataContract和ISerializable),这是第二个错误告诉您的。 Exception已经实现了ISerializable,WCF将支持它。它看起来像你的代码,你已经添加了一些方法(与SerializationInfo)。

就像Marc说的那样,关于使用DataContract的东西并没有太多关于.NET的东西,它只是在客户端消费方面与平台无关。