2014-11-30 3 views
1

Я пытаюсь сериализовать некоторые данные, которые содержат наблюдаемую коллекцию объектов и записать ее в текстовую плитку. Мой результат [], и теперь я знаю, где я ошибся.DataContractJsonSerializer неправильно сериализуется

мой код объекта

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); 
+0

объект objectlist? объект objectlist содержит наблюдаемый набор строк и строку. это можно сделать? – user776914

ответ

2

Вы не можете иметь класс, который является как коллекция и имеет дополнительные свойства для сериализации. Тем не менее, у вас может есть класс, который содержит список и имеет дополнительные свойства, которые, как я думаю, вы пытаетесь сделать здесь. Для того, чтобы сделать его работу вам нужно будет внести некоторые коррективы в ваш код:

  1. Вашего ObjectList не должен наследовать от ObservableCollection<T> (или любого другого типа списка)
  2. Вы должны отметить свой класс с [DataContract] и отметьте свойство/поля, которые вы хотите сериализовать с помощью [DataMember].
  3. Когда вы создаете свой экземпляр DataContractJsonSerializer, передайте конструктору тип верхнего уровня, который вы хотите сериализовать. В вашем случае это должно быть ObjectList, а не ObservableCollection<ObjectList>.
  4. Когда вы вызываете WriteObject в сериализаторе, вторым параметром должен быть экземпляр объекта, который вы сериализуете, а не Type.

Вот исправленный класс:

[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"]} 
+0

Работа в [DataContract] и [DataMember] работает! – user776914

+0

Могу я просто спросить, почему я могу успешно выполнить сериализацию только для одной наблюдаемой коллекции без использования [datacontract] и [datamember]? В чем разница между этими двумя примерами? – user776914

+0

Один список, а другой нет. Если это список, вы не можете использовать атрибут [DataContract], и если он не является списком, вы должны использовать этот атрибут. –

Смежные вопросы