将对象反序列化为自身

Deserialize object to itself

我找到了一些关于这个问题的线索,比如 this and this,但我不知道如何为我的代码实现这个。

我有这样的东西:

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

这让我感到 "cannot assign to ' this ' because it is read-only"。由于我读取了一个文件并且我需要等待它,它必须是异步的,然后我不能将 class 作为 return 类型。

关于如何将其反序列化为自身的任何想法?

您不能分配给 this。它是对象的实例,更改它没有任何意义。

有一个 returns Party 的静态方法(并用它来创建 class):

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

或者使用反序列化对象将信息加载到您的 class 中(这会很低效,因为它们是同一类型):

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

显然,这里应该优先使用静态方法,被认为是factory pattern.