- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在反序列化 mimeKit.mimeMessage 时遇到一些问题,我将其序列化为 JSON 字符串并存储在 redis 键值缓存中。
我能够使用 json.NET 或 Jil 成功地序列化和存储 mimeMessage,但是当我去反序列化时,抛出以下错误。
由 json.NET 抛出
Unable to find a constructor to use for type MimeKit.Header. A class should either have a default constructor, one constructor with arguments or a constructor marked with the JsonConstructor attribute. Path 'Headers[0].Offset', line 1, position 22.
我正在使用 StackExchange.Redis 方法 stringGet 来获取序列化对象,然后将 RedisValue 传递给 Json.Net;下面的代码片段:
RedisValue result = db.StringGet(key);
MimeMessage message = new MimeMessage();
message = JsonConvert.DeserializeObject<MimeMessage>(result);
据我所知,默认构造函数总是被创建,这让我有点难以理解,默认构造函数是否已被指定为私有(private),如果是,为什么?
我也检查了返回的JSON字符串的格式,是正确的。
感谢您的帮助。
最佳答案
首先,清理一下:
It is my understanding that a default constructor is always created, which makes this a little hard to get my head around, could the default constructor have been specified as private, and if so why?
那不是真的。当您定义一个没有 构造函数的类时,会为您生成一个默认的无参数构造函数。如果您提供构造函数,则不再生成此默认构造函数。换句话说,一个类可能没有默认构造函数。
考虑到这一点,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<JObject>(reader);
HeaderId headerId = obj["Id"].ToObject<HeaderId>();
Header header = new Header(headerId, obj["Value"].ToObject<string>());
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
。然后,我们从 JObject
中选取 HeaderId
和 Value
以创建 Header
实例。
这里要注意:我对这个库了解不多。这可能不是实例化 Header
的最佳方式,而且我可能会不小心丢弃一些信息。我只做了一些非常基本的测试。
一旦解决了这个问题,您就会遇到另一个与不接受 null
值的属性 setter 有关的问题。
具体来说,ResentMessageId
和 MimeVersion
属性在 setter 中有逻辑,如果您提供 null
。这是一个问题,因为当 MimeMessage
被实例化时,这些值可以为空。
一个解决方法是创建一个排除这些属性的 ContractResolver
:
public class MimeMessageContractResolver : DefaultContractResolver
{
private static HashSet<string> excludedMembers = new HashSet<string>
{
"ResentMessageId",
"MimeVersion"
};
protected override List<MemberInfo> GetSerializableMembers(Type objectType)
{
var baseMembers = base.GetSerializableMembers(objectType);
if (typeof(MimeMessage).IsAssignableFrom(objectType))
{
baseMembers.RemoveAll(m => excludedMembers.Contains(m.Name));
}
return baseMembers;
}
}
这样,我们就不会意外地将 null
传递给其中一个属性的 setter 。
这里还有一个注意事项:我注意到即使我忽略了 MimeVersion
和 ResentMessageId
如果 header 包含MimeVersion
和/或 ResentMessageId
header 。我猜这是在某处嵌入到 MimeMessage
中,但同样,我对这个库并不完全熟悉。
所以要使用上面的类(仅在反序列化时),您需要这样做:
string someJsonString = "{ ... }";
MimeMessage deserialized = JsonConvert.DeserializeObject<MimeMessage>(
someJsonString, new JsonSerializerSettings
{
ContractResolver = new MimeMessageContractResolver(),
Converters = new JsonConverter[]
{
new MimeHeaderConverter()
}
});
通过一些基本测试,这似乎工作正常。您最终可能会在实际使用中遇到更多问题,因此无法保证。
希望这至少能让您入门。
关于c# - 反序列化 mimekit.MimeMessage 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30712228/
我被要求向我们的客户发送签名和加密的邮件,但是,这是我第一次与签名和加密的斗争(我想强调这一点)。 我尝试过使用 OpaqueMail 和 MimeKit。 因为我真的不太了解 OpaqueMail,
我正在使用 MailKit/MimeKit 1.2.7(最新的 NuGet 版本)。 我尝试按照 API documentation 中的示例在电子邮件的 HTML 正文中嵌入图像。 (“使用 Bod
使用 .NET 的 MailAddressCollection,您可以调用 .Add(addresses),其中 addresses 是以逗号分隔的电子邮件地址列表。 Mimekit 有等效项吗? 我
我正在尝试通过浏览器向用户返回一个 eml 文件。事情是,没有静态的 eml 文件 - 页面构建它。我可以使用以下方法在 MimeKit 中构建示例消息 public FileResult TestS
我最近一直在制作自己的邮件客户端并添加了一个接收选项,我使用 mimekit 和 mailkit 作为插件并且能够使用应该显示内容的阅读器下载我的大部分邮件(现在它显示主题,到,从,日期) 我下载主题
我正在使用 mimekit 为我的项目接收和发送邮件。我正在发送收到的邮件并进行了一些修改(从零件到零件)。现在我需要在正文部分进行修改。我将用星号字符替换特定单词。每封邮件的特定文本不同。邮件可以是
我在反序列化 mimeKit.mimeMessage 时遇到一些问题,我将其序列化为 JSON 字符串并存储在 redis 键值缓存中。 我能够使用 json.NET 或 Jil 成功地序列化和存储
我开始使用@jstedfast Mimekit/Mailkit library ,这很棒,可以使用其主题行搜索无法交付的内容。我尝试使用 message.to、message.resentto。 我如
有没有办法只过滤带附件的电子邮件?我正在使用这段代码 using (var client = new ImapClient()) { client.Connect(IM
我正在使用 MailKit 库来处理电子邮件,效果一直很好。但是,我正在尝试将电子邮件拆分成它们的组成文件 a) 主电子邮件(无附件)b) 单独的附件文件,以存储在文件系统中。 我可以单独保存附件,但
我从我的电子邮件中找到了我的 smime.p7m,我将其作为流读取并尝试使用 MimeKit 对其进行解密,但失败并显示 Operation is not valid due to the curre
我正在使用@jstedfast Mimekit/Mailkit 库,用于从我的应用程序发送大量电子邮件。我想知道如何获取每封电子邮件的发送状态。这是我第一次尝试得到这个,在一些 RnD 之后,我知道我
我在玩 MailKit/MimeKit 时遇到了一些问题。我想使用流发送带有附件的电子邮件。 MimeKit 提供了 BodyBuilder 类,这使得创建正文消息和附加文件变得非常容易: publi
我正在使用 MailKit/MimeKit 1.2.7(最新的 NuGet 版本)。 使用 ImapClient 删除电子邮件非常简单...... client.Inbox.AddFlags(uniq
有没有办法将 MimeKit.MimeMessage 转换为可以在网络浏览器中呈现的 HTML?我不关心邮件附件,但希望能够在浏览器中显示包含嵌入图像的邮件正文。我是 MimeKit 的新手,因此在
尝试使用 MailKit 和 MimeKit 发送电子邮件时,我收到以下错误: Unable to read data from the transport connection: A connect
我只想检查 MIME 消息是否使用 Mimekit 加密或签名。 我不想对其进行解密或验证其签名,我只想知道它是否加密或签名。 我希望找到它作为函数:MimeMessage 类中的 IsSigned(
请不要将其标记为重复问题,因为邮件消息存在解决方案,mailkit 不存在。 我正在尝试向多个地址发送电子邮件。我尝试使用下面的代码,但我没有尝试使用循环。 var message =
使用MimeKit如何获取附件内容?这是我的: var mimeMessage = MimeMessage.Load(@"test.eml"); var attachments = mimeMessa
Visual Studio 2015 中的 0 代码 1 我正在使用 Mailkit 最新版本 (1.18.1.1) 从我自己的电子邮件服务器发送电子邮件。 2 电子邮件服务器有一个自签名证书,该证书
我是一名优秀的程序员,十分优秀!