gpt4 book ai didi

c# - 包含异常的 DataContract

转载 作者:行者123 更新时间:2023-12-02 03:05:58 26 4
gpt4 key购买 nike

我有一个类(带有属性和一些方法)

[DataContract]
public partial class AbstractApplicationCallDto
{
[IgnoreDataMember]
private Exception exception;

[DataMember]
private string exceptionString;

[DataMember]
private string sessionId = null;

[DataMember]
private MyType myType = null;
}

当我将 IgnoreDataMember 添加到类型为 Exception 的字段时,我可以毫无问题地为客户端生成代码。但如果添加DataMember,则不会生成任何内容。

那么为什么呢?如何将 Exception类型添加到 DataContract

最佳答案

这并不是真正的答案,只是关于异常序列化的一些注释,我想要一些代码的额外空间......

您是否考虑过使用FaultContracts 来代替? http://msdn.microsoft.com/en-us/library/ms733721.aspx

尽管 Exception 类型是可序列化的,但通常在其 _data 字段中设置的任何内容都是不可序列化的,有时会导致序列化问题。 See here.解决此问题的方法是在序列化之前将 _data 字段设置为 null:

        Exception ex = error;
FieldInfo fieldInfo = typeof(Exception).GetField("_data", BindingFlags.Instance | BindingFlags.NonPublic);
while (ex != null)
{
fieldInfo.SetValue(ex, null);
ex = ex.InnerException;
}

另一个问题是,通过向 DataContract 添加 Exception 类型,您只能覆盖实际 Exception 实例的情况:

AbstractApplicationCallDto.Exception = new Exception();

但是 Exception 的任何派生都无法工作,例如:

AbstractApplicationCallDto.Exception = new NullReferenceException();

要实现这一点,您必须在数据协定中添加一个 [KnownType] 属性,这样您最终会得到如下结果:

[DataContract]
[KnownType(typeof(NullReferenceException))]
[KnownType(typeof(InvalidOperationException))]
[KnownType(typeof(ApplicationException))]
[KnownType(typeof(...))] // add one for every type of exception you might need to serialize back, or that might be contained in Exception.InnerException
public partial class AbstractApplicationCallDto
{
...

回到你原来的问题,我想不出当契约(Contract)中存在 Exception 类型时客户端生成工具无法生成任何内容的原因......它是否给出了一个错误?它会生成任何代码吗?

关于c# - 包含异常的 DataContract,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7362743/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com