如何创建一个可以添加到Windows.Foundation.Collections.ValueSet的类

时间:2017-09-22 15:13:47

标签: c# uwp

我正在制作一个UWP应用程序,它利用AppServiceConnection将数据发送到COM样式的应用程序。 AppServiceConnection.SendMessageAsync()采用Windows.Foundation.Collections.ValueSet

类型

ValueSet类是一个集合,类似于存储类型为<string, object>

的KeyValuePairs的字典

我在向ValueSet添加数据时遇到问题,每次尝试添加对象时都会收到错误:&#34;不支持此类数据。 (来自HRESULT的异常:0x8007065E)&#34;

对此错误的研究表明,要添加的对象必须是可序列化的类型,并且可以实现Windows.Foundation.Collections.IPropertySet,它本身就是一个似乎存储keyvaluepairs的集合接口。

我想知道如何创建一个可以添加到ValueSet的类。我是否必须创建一个实现IPropertySet的新集合,或者是否有某种方法可以使类本身可序列化并且能够添加到ValueSet中?

如果我必须实施IPropertySet,任何人都可以向我指出如何做到这一点的体面文档吗?

1 个答案:

答案 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; }
}