我有这样的Mass Transit消息界面:
public interface IPerson
{
ICollection<PersonalName> Names { get; }
}
public class PersonalName
{
public string FamilyName { get; set; }
public string GivenName { get; set; }
public string SecondName { get; set; }
public string Use { get; set; }
}
这适用于使用JsonMessageSerializer
序列化和反序列化邮件。我也可以使用XmlMessageSerializer
序列化消息,结果看起来有点像这样:
<person>
<names>
<familyName>Simpson</familyName>
<givenName>Homer</givenName>
<secondName>Jay</secondName>
<use>Official</use>
</names>
<names>
<givenName>Homie</givenName>
<use>Nickname</use>
</names>
</person>
如果集合为空或者它有多个元素,我可以反序列化它。但是,如果集合包含正好一个元素,那么当我去反序列化时,我会收到此错误:
无法将当前JSON对象(例如
{"name":"value"}
)反序列化为类型&#39;System.Collections.Generic.ICollection`1[MyNs.PersonalName]
&#39;因为该类型需要JSON数组(例如[1,2,3]
)才能正确反序列化。要修复此错误,请将JSON更改为JSON数组(例如
[1,2,3]
)或更改反序列化类型,使其成为普通的.NET类型(例如,不是像整数这样的基本类型,而不是集合类型像数组或List<T>
),可以从JSON对象反序列化。 JsonObjectAttribute也可以添加到类型中以强制它从JSON对象反序列化。路径&#39; person.names.familyName&#39;。
我可以通过使用数组或List<T>
来解决这个问题,但我真的很想避免这样做。有没有办法让Mass Transit的XmlMessageSerializer
反序列化ICollection<T>
类型?由于Mass Transit使用Json.NET进行序列化(即使是XML),我希望有一些方法可以注释该类型,以便它可以接受ICollection<T>
。
答案 0 :(得分:0)
而不是尝试反序列化:
{"FamilyName":"Smith","GivenName":"John"}
你必须传入一个数组来反序列化:
[{"FamilyName":"Smith","GivenName":"John"}]