DataContractJsonSerializer没有正确序列化

时间:2014-11-30 23:30:06

标签: c# serialization json.net windows-phone-8.1

我正在尝试序列化一些包含可观察对象集合的数据,并将其写入文本块。我的输出是[],我现在知道我犯了什么错误。

我的目标代码

public class ObjectList : ObservableCollection<string>, INotify...
{
    public ObservableCollection<string> ObjectListInstance = new ObservableCollection<string>();
    public string Name;

    ... get set methods & property changed method
}

我的IO代码

using (Stream newStream = await Windows.Storage.ApplicationData.Current.LocalFolder.OpenStreamForWriteAsync("file.txt", Windows.Storage.CreationCollisionOption.ReplaceExisting))
{
      DataContractJsonSerializer newDataContractJsonSerializer = new DataContractJsonSerializer(typeof(ObservableCollection<ObjectList>));
      newDataContractJsonSerializer.WriteObject(newStream, ObjectList);
}

我的代码存根

    ObjectList newObjectList = new ObjectList();
        newObjectList.Name = "AAA NAME";


        newObjectList.ObjectListInstance.Add("ITEM 1");
        newObjectList.ObjectListInstance.Add("ITEM 2");

        bool status = await IOClass.IO.WriteCategory(newObjectList);

1 个答案:

答案 0 :(得分:2)

您不能拥有 这个集合的类,并且具有要序列化的其他属性。但是,您可以拥有一个包含列表的类,并具有其他属性,这是我认为您在此处尝试做的事情。要使其正常工作,您需要对代码进行一些调整:

  1. 您的ObjectList不应继承ObservableCollection<T>(或任何其他列表类型)
  2. 您必须使用[DataContract]标记您的课程,并使用[DataMember]标记要序列化的属性/字段。
  3. 创建DataContractJsonSerializer实例时,请将要序列化的顶级类型传递给构造函数。在您的情况下,这应该是ObjectList,而不是ObservableCollection<ObjectList>
  4. 当您在序列化程序上调用WriteObject时,第二个参数应该是您要序列化的对象实例,而不是Type
  5. 以下是更正的课程:

    [DataContract]
    public class ObjectList
    {
        [DataMember]
        public ObservableCollection<string> ObjectListInstance = new ObservableCollection<string>();
        [DataMember]
        public string Name;
    }
    

    以下是更正的序列化代码:

    DataContractJsonSerializer newDataContractJsonSerializer = 
                               new DataContractJsonSerializer(typeof(ObjectList));
    
    newDataContractJsonSerializer.WriteObject(newStream, newObjectList);
    

    通过这些更改,您应该获得以下JSON输出:

    {"Name":"AAA NAME","ObjectListInstance":["ITEM 1","ITEM 2"]}