在UWP应用中,我使用的是选择联系人
var contactPicker = new Windows.ApplicationModel.Contacts.ContactPicker();
Contact contact = await contactPicker.PickContactAsync();
然后我使用Json.NET如下序列化返回的联系人对象:
string c = JsonConvert.SerializeObject(contact);
但是问题是联系人对象中(应为)IList
类型的属性,例如电话,电子邮件,地址...等未正确序列化。它们是空的JSON数组。
[检查后,我发现问题是这些属性没有按预期返回实现接口IList
的类的对象!相反,它们返回类型为System._ComObject
的对象。因此,当调用contact.Phones.GetType().FullName
时,我得到:System._ComObject
。
[contact.Emails
,contact.Addresses
...等也相同
是否有帮助正确获取属性并因此正确序列化联系人对象?
大多数UWP类型实际上是内部的COM对象。使它们显示并充当它们声称的C#投影有一些魔力,但是如果您尝试使用Reflection做事(如JSON.NET所做的那样),那么现实将使人头疼。
一些快速测试揭示了两个可能的选择:
1]通过LINQ contactPicker.PickContactsAsync()
(或我想象的.ToList()
)调用,可以将从.ToArray()
返回的值强制为真实的C#对象。您必须为每个Contact
对象上的每个collection属性执行此操作,但是在它的结尾,您将拥有一个可序列化的C#对象。
2)为Contact
对象编写您自己的JSON.NET序列化程序,该序列化程序了解如何分别访问和序列化每个属性。如果您执行var singleContact = await contactPicker.pickContactAsync()
之类的操作,则仍然可以按照C#代码中的期望方式执行singleContact.Addresses[0]
或其他类似列表的操作,这意味着编写这样的序列化器是非常可能的。