gpt4 book ai didi

c# - 将 ArgumentNullException 序列化为 Json

转载 作者:行者123 更新时间:2023-11-30 17:31:41 24 4
gpt4 key购买 nike

使用 JSON.NET 将 System.ArgumentNullException 序列化为 JSON 时,部分消息似乎丢失了:

var json = JsonConvert.SerializeObject(new ArgumentNullException("argument", "Some Message"));

返回:

{
"ClassName":"System.ArgumentNullException",
"Message":"Some Message",
"Data":null,
"InnerException":null,
"HelpURL":null,
"StackTraceString":null,
"RemoteStackTraceString":null,
"RemoteStackIndex":0,
"ExceptionMethod":null,
"HResult":-2147467261,
"Source":null,
"WatsonBuckets":null
}

我希望消息 token 是:

"Some Message\r\nParameter name: argument"

正如 codefuller 所指出的,ArgumentNullException 实现了 ISerializable 并且是罪魁祸首。我可以使用自定义 JsonSerializerSettings 来禁用它。

但是,应用程序需要序列化任何对象,包括具有 ArgumentNullException 属性的对象。我宁愿避免忽略ISerialiable,除非它会带来问题。

我的两个解决方案都包含自定义 JsonConverter

方案一:集中式 JsonSerializer

  • 创建 JsonConverters 的静态列表以添加到 JsonSerializer.Converters
  • 包含一个显式处理 ArgumentNullExceptionExceptionConverter
  • 在我需要序列化的任何地方,确保我的 JsonSerializer 包含这些转换器

缺点:其他开发人员必须严格确保他们将这些转换器包含在他们所做的任何序列化中。

解决方案 2:覆盖 ArgumentNullException

我可以创建一个 CustomArgumentNullException 类,并使用 JsonConvert 属性标记它以利用我的自定义转换器。

缺点:其他开发人员必须严格确保他们引发的是 CustomArgumentNullException 而不是 ArgumentNullExcpetion

希望的解决方案

我很想用指向我的自定义转换器的 JsonConverter 属性以某种方式标记现有的 ArgumentNullException。有没有什么方法可以在 Json.NET 代码库中实现这一点?

最佳答案

异常类实现ISerializable 接口(interface)。默认情况下,对于此类对象,Json.Net 使用 ISerializable.GetObjectData() 方法进行数据序列化。换句话说,ArgumentNullException 类自行控制其数据的序列化方式。它内部的某个地方有一个逻辑,只序列化传递给构造函数的实际消息,没有 Parameter name: argument 部分。

您可以更改此 Json.Net 行为并避免将 GetObjectData() 与以下 JsonSerializerSettings 一起使用:

var settings = new JsonSerializerSettings()
{
ContractResolver = new DefaultContractResolver()
{
IgnoreSerializableInterface = true,
},
ReferenceLoopHandling = ReferenceLoopHandling.Ignore
};

var json = JsonConvert.SerializeObject(new ArgumentNullException("argument", "Some Message"), settings);

但是在这种情况下,序列化字段集将不同于原始 json。检查它是否真正适合您的需求。

关于c# - 将 ArgumentNullException 序列化为 Json,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47564455/

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