如何将从ParseObject派生的类序列化为App本地存储?

时间:2015-12-28 22:04:14

标签: c# serialization parse-platform uwp

使用Parse.com,我有一个这样的子类:

[DataContract]
[ParseClassName("Event")]
public class TestDerivedObject : ParseObject
{
    [DataMember]
    [ParseFieldName("name")]
    public string Name
    {
        get { return GetProperty<string>(); }
        set { SetProperty(value); }
    }

    [DataMember]
    [ParseFieldName("description")]
    public string Description
    {
        get { return GetProperty<string>(); }
        set { SetProperty(value); }
    }
}

当我尝试保存此类对象的实例时:

ApplicationDataContainer _localSettings = ApplicationData.Current.LocalSettings;
_localSettings.Values["Test"] = myTestDerivedObject ;

它引发了一个例外:

  

WinRT信息:尝试序列化要写入的值时出错   到应用程序数据存储

     

其他信息:不支持此类型的数据。

如何将这样的对象安全地保存到本地存储?我在Android实现中看到,您可以使用Pin方法为您执行此操作!

1 个答案:

答案 0 :(得分:2)

Windows 10(UWP)不允许您在LocalSettings字典中存储复杂对象。

  

应用设置支持大多数Windows运行时数据类型:

     
      
  • UInt8,Int16,UInt16,Int32,UInt32,Int64,UInt64,Single,Double
  •   
  • 布尔
  •   
  • Char16,String
  •   
  • DateTime,TimeSpan
  •   
  • GUID,Point,Size,Rect
  •   
  • ApplicationDataCompositeValue
  •   
     

您无法直接将其他类型的对象分配给应用数据。您可以将数据序列化为其中一种受支持的数据类型,例如,您可以将数据序列化为JSON并将其存储为字符串,但是您需要处理序列化。

来源:MSDN

所以你必须自己序列化为一个字符串。在我看来,最简单的方法是使用JSON.NET序列化为JSON:

string serialized = JsonConvert.SerializeObject(myTestDerivedObject);

更新(由@Depechie提供给我)

看起来你基本上是screwed,因为你正在使用Parse.com个对象。因为这些对象是要序列化的PITA,因为它们实现了IEnumerable<KeyValuePair<string, object>>。可能的解决方案是使用例如AutoMapperParse.com对象映射到另一个自定义类型(或手动映射属性)并序列化您自己的类型。