mimemessage类是什么_反序列化mimekit.MimeMessage对象 - c#

博客讨论了在反序列化MimeKit的MimeMessage对象时遇到的错误,特别是使用JSON.NET时无法找到Header类的构造函数。文章提出了解决方案,包括创建自定义的JsonConverter和ContractResolver,以处理MimeMessage的特定属性。还提到了在实际应用中可能遇到的其他问题。
摘要由CSDN通过智能技术生成

我在反序列化mimeKit.mimeMessage时遇到一些问题,该序列已序列化为JSON字符串并存储在redis键值缓存中。

我能够使用json.NET或Jil成功地序列化并存储mimeMessage,但是当我进行反序列化时,会引发以下错误。

由json.NET抛出

找不到用于MimeKit.Header类型的构造函数。一个类应该具有一个默认构造函数,一个带有参数的构造函数或一个标有JsonConstructor属性的构造函数。路径“ Headers [0] .Offset”,第1行,位置22。

我正在使用StackExchange.Redis方法stringGet来获取序列化的对象,然后将RedisValue传递到Json.Net。下面的代码段:

RedisValue result = db.StringGet(key);

MimeMessage message = new MimeMessage();

message = JsonConvert.DeserializeObject(result);

据我了解,总是会创建一个默认的构造函数,这使我有点难以理解,是否可以将默认的构造函数指定为私有,如果可以,为什么?

我还检查了返回的JSON字符串的格式,它是正确的。

谢谢你的帮助。

参考方案

首先,要清理一下:

据我了解,总是会创建一个默认的构造函数,这使我有点难以理解,是否可以将默认的构造函数指定为私有,如果可以,为什么?

这不是真的。当您定义没有构造函数的类时,将为您生成一个默认的无参数构造函数。如果提供构造函数,则不再生成此默认构造函数。换句话说,一个类可能没有默认的构造函数。

考虑到这一点,MimeKit.Header类提供了6个构造函数,这些构造函数都不带任何参数。因此,JSON.NET不知道如何实例化此类,这就是发生异常的原因。

由于您对MimeKit.Header类没有任何控制权,因此让JSON.NET知道如何构造Header实例的一种方法是使用自定义转换器:

public class MimeHeaderConverter : JsonConverter

{

public override object ReadJson(

JsonReader reader,

Type objectType,

object existingValue,

JsonSerializer serializer)

{

JObject obj = serializer.Deserialize(reader);

HeaderId headerId = obj["Id"].ToObject();

Header header = new Header(headerId, obj["Value"].ToObject());

return header;

}

public override void WriteJson(

JsonWriter writer,

object value,

JsonSerializer serializer)

{

throw new NotImplementedException();

}

public override bool CanConvert(Type t)

{

return typeof(Header).IsAssignableFrom(t);

}

public override bool CanRead { get { return true; } }

public override bool CanWrite { get { return false; } }

}

在这里,我们首先将Header类反序列化为JObject。然后,我们从HeaderId中选择Value和JObject以便创建Header实例。

这里的注释:我对该库了解不多。这可能不是实例化Header的最佳方法,而且我可能会不小心丢弃一些信息。我只做了一些非常基本的测试。

一旦解决了这个问题,您就会遇到另一个与不接受null值的属性设置器有关的问题。

具体来说,如果您提供ResentMessageId,则MimeVersion和ArgumentException属性具有在设置器中引发null的逻辑。这是一个问题,因为在实例化MimeMessage时这些值可以为null。

一种解决方法是创建一个不包含这些属性的ContractResolver:

public class MimeMessageContractResolver : DefaultContractResolver

{

private static HashSet excludedMembers = new HashSet

{

"ResentMessageId",

"MimeVersion"

};

protected override List GetSerializableMembers(Type objectType)

{

var baseMembers = base.GetSerializableMembers(objectType);

if (typeof(MimeMessage).IsAssignableFrom(objectType))

{

baseMembers.RemoveAll(m => excludedMembers.Contains(m.Name));

}

return baseMembers;

}

}

这样,我们绝不会意外地将null传递给这些属性之一的设置器。

这里也要注意:我注意到即使标题忽略了MimeVersion和ResentMessageId标题,即使忽略了MimeVersion和ResentMessageId,它们仍然会被设置。我猜这是放在某个地方的MimeMessage中的,但是同样,我对这个库并不完全熟悉。

因此,要使用上述类(仅在反序列化时),您可以这样做:

string someJsonString = "{ ... }";

MimeMessage deserialized = JsonConvert.DeserializeObject(

someJsonString, new JsonSerializerSettings

{

ContractResolver = new MimeMessageContractResolver(),

Converters = new JsonConverter[]

{

new MimeHeaderConverter()

}

});

通过一些基本测试,这似乎可以正常工作。您最终可能会在实际使用中遇到更多问题,因此无法保证。

希望这至少可以帮助您入门。

JSON PATH字段NULL检查表达式 - java

我有一个像bellow的json数组:{ "store": { "book": [ { "category": "reference", "author": "Nigel Rees", "title": "Sa…json_encode网址失败 - php

有人在this bug附近吗?echo json_encode(array('url'=>'/foo/bar')); {"url":"\/foo\/bar"} 我使用Zend_Json and Zend_Json_Expr以便我甚至可以在js对象中获取回调函数-但我无法获得…json.dumps弄乱顺序 - python

我正在使用json module创建一个包含类似条目的json文件json.dumps({"fields": { "name": "%s", "city": "%s", "status": "%s", "cou…JSON SCHEMA PATTERN逗号分隔列表 - python

我的json模式中具有以下模式,并且我需要根据以下模式包含逗号分隔的值。当前模式只能像DV2一样处理一种模式所以我应该如何修改我的模式以包括多个字符串,如下所示,但它应该与声明的模式匹配。例如:“ DV2”,“ DEV1”,“ DEV3”,“ ST”, "ENVIRONMENT": { "type": "st…JSON.NET如何删除节点 - c#

我有一个像下面这样的json:{ "d": { "results": [ { "__metadata": { }, "prop1": "value1", "prop2": "value2", "__some…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值