我正在制作一个UWP应用程序,它利用AppServiceConnection
将数据发送到COM样式的应用程序。 AppServiceConnection.SendMessageAsync()
采用Windows.Foundation.Collections.ValueSet
ValueSet类是一个集合,类似于存储类型为<string, object>
我在向ValueSet添加数据时遇到问题,每次尝试添加对象时都会收到错误:&#34;不支持此类数据。 (来自HRESULT的异常:0x8007065E)&#34;
对此错误的研究表明,要添加的对象必须是可序列化的类型,并且可以实现Windows.Foundation.Collections.IPropertySet
,它本身就是一个似乎存储keyvaluepairs的集合接口。
我想知道如何创建一个可以添加到ValueSet的类。我是否必须创建一个实现IPropertySet
的新集合,或者是否有某种方法可以使类本身可序列化并且能够添加到ValueSet中?
如果我必须实施IPropertySet
,任何人都可以向我指出如何做到这一点的体面文档吗?
答案 0 :(得分:2)
WinRT没有可序列化对象的概念;它只支持值类型,如整数,bool,字符串,数组,日期时间等,以及这些东西的集合。查看PropertyValue
class的静态Create*
成员的示例(尽管您不需要使用这些方法来创建放入集合中的项目)。
如果要序列化WinRT对象或您自己的.NET对象,可以将其转换为JSON或XML,然后将其放入ValueSet
。
例如:
public void TestValueSet()
{
var x = new ValueSet();
// Integers are OK
x.Add("a", 42);
// URIs are not OK - can't be serialized
try
{
x.Add("b", new Uri("http://bing.com"));
}
catch (Exception ex)
{
Debug.WriteLine("Can't serialize a URI - " + ex.Message);
}
// Custom classes are not OK
var myClass = new MyClass { X = 42, Y = "hello" };
try
{
x.Add("c", myClass);
}
catch (Exception ex)
{
Debug.WriteLine("Can't serialize custom class - " + ex.Message);
}
// Serialized classes are OK
x.Add("d", Serialize<MyClass>(myClass));
foreach (var kp in x)
{
Debug.WriteLine("{0} -> {1}", kp.Key, kp.Value);
}
}
string Serialize<T>(T value)
{
var dcs = new DataContractSerializer(typeof(T));
var stream = new MemoryStream();
dcs.WriteObject(stream, value);
stream.Position = 0;
var buffer = new byte[stream.Length];
stream.Read(buffer, 0, (int)stream.Length);
return Encoding.UTF8.GetString(buffer);
}
}
[DataContract]
public class MyClass
{
[DataMember]
public int X { get; set; }
[DataMember]
public string Y { get; set; }
}