2015-01-20 2 views
0

Я нашел некоторые темы об этой проблеме, например this и this, но я не могу понять, как я мог реализовать это для своего кода.Deserialize object to itself

У меня есть что-то вроде этого:

public sealed class Party 
{ 
    public Party() 
    { 
     load(); 
    } 
    .... 
    public async void Load() 
    { 
     string fileName = this.Name + ".xml"; 
     var files = ApplicationData.Current.LocalFolder.GetFilesAsync(Windows.Storage.Search.CommonFileQuery.OrderByName).GetResults(); 
     var file = files.FirstOrDefault(f => f.Name == fileName); 
     if (file != null) 
     { 
      using (var stream = await ApplicationData.Current.LocalFolder.OpenStreamForReadAsync(fileName)) 
      { 
       XmlSerializer serializer = new XmlSerializer(typeof(Party)); 
       Party data = (Party)serializer.Deserialize(stream); 
       this = data; 
      } 
     } 
    } 
} 

Это бросает мне «не может присвоить„это“, потому что это только для чтения». Поскольку я читаю файл, и мне нужно его ждать, он должен быть асинхронным, и тогда у меня не может быть класса как возвращаемого типа.

Любые идеи относительно десериализации этого для себя?

+0

Почему бы не обработать этот метод как заводский метод для создания экземпляров 'Party'? – 48klocs

+0

@ 48klocs заводские методы - это что-то новое для меня. хотите заполнить пример, или вы просто рекомендуете google? :) – gubbfett

+0

Вот мой upvote, чтобы удалить этот уродливый '-1'. Это очень важный вопрос, независимо от его невозможности. – RiA

ответ

2

Вы не можете назначить this. Это экземпляр объекта, и нет смысла его менять.

Либо иметь статический метод, который возвращает партию (и использовать, чтобы создать класс):

public static Party Load() 
{ 
    // ... Deserialize 
    return (Party)serializer.Deserialize(stream); 
} 

Или загрузить информацию в свой класс, используя десериализованный объект (который был бы неэффективным, так как они» повторно того же типа):

public void Load() 
{ 
    // ... Deserialize 
    Party data = (Party)serializer.Deserialize(stream); 
    this.Name = data.Name; 
    this.PartyInfo = data.PartyInfo; 
} 

Очевидно, что статический метод должен быть предпочтительным здесь, и считается factory pattern.

+0

теперь я чувствую себя действительно глупо. так как у «партии» на самом деле есть только имя и список, ваш второй вариант блистателен в простоте. почему вы считаете его неэффективным? – gubbfett

+0

@gubbfett Поскольку у вас уже есть сторонний объект, если вы копируете все данные, теперь у вас есть 2 копии его, и первый будет собираться мусором. Если вы используете статический метод, вы просто изменяете, как вы используете его с Party Party = new Party() 'на Party Party = Party.Load()', и теперь он использует половину памяти. –

+0

ах. ОК. в первом примере вы хотите объяснить десериализацию? так как я читал из файла, я только что нашел методы async. usig async я могу иметь только пустоту или задачу. Должен ли я иметь поток как некоторый род глобального или что-то еще? – gubbfett