- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
使用 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
ArgumentNullException
的 ExceptionConverter
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/
出于好奇,我尝试了一些原型(prototype)制作,但似乎只允许在第一个位置使用子例程的原型(prototype) &。 当我写作时 sub test (&$$) { do_somethin
我需要开发一个类似于 Android Play 商店应用程序或类似 this app 的应用程序.我阅读了很多教程,发现几乎每个教程都有与 this one 类似的例子。 . 我已经开始使用我的应用程
考虑一个表示“事件之间的时间”的列: (5, 40, 3, 6, 0, 9, 0, 4, 5, 18, 2, 4, 3, 2) 我想将这些分组到 30 个桶中,但桶会重置。期望的结果: (0, 1,
我是一名优秀的程序员,十分优秀!