【问题标题】:Deserialize object to itself将对象反序列化为自身
【发布时间】:2015-03-19 06:25:05
【问题描述】:

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

我有这样的事情:

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

这让我“无法分配给' this ',因为它是只读的”。由于我读取了一个文件并且需要等待它,因此它必须是异步的,然后我不能将类作为返回类型。

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

【问题讨论】:

  • 为什么不将该方法视为工厂方法来生成Party 的实例?
  • @48klocs 工厂方法对我来说是新事物。想填写一个例子,或者你只是推荐谷歌? :)
  • 这是我删除那个丑陋的'-1'的赞成票。这是一个非常重要的问题,尽管它不可​​能。

标签: c# .net xaml microsoft-metro


【解决方案1】:

您不能分配给this。它是一个对象的实例,改变它是没有意义的。

要么有一个返回 Party 的静态方法(并使用它来创建类):

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

【讨论】:

  • 现在我觉得自己很愚蠢。由于“派对”实际上只有一个名称和一个列表,因此您的第二个选项非常简单。为什么你觉得效率低?
  • @gubbfett 因为你已经有了派对对象,如果你复制了所有的数据,现在你有 2 个副本,第一个将被垃圾回收。如果您使用静态方法,您只是将使用方式从Party party = new Party() 更改为Party party = Party.Load(),现在它使用了一半的内存。
  • 啊。好的。在你的第一个例子中,你想解释反序列化吗?因为我从文件中读取,所以我刚刚找到了异步方法。 usig async i 只能有 void 或 task。我应该将流作为某种全球性的东西吗?
  • @gubbfett 返回Task<Party> 并确保您像下面这样使用它:Party party = await Party.Load()。您可能希望在使用该方法时将该方法重命名为LoadAsync(),因此很明显它是一个异步方法。其余的 Load 代码保持不变,只需将最后一行更改为 return data;
猜你喜欢
  • 2021-12-16
  • 2020-05-10
  • 1970-01-01
  • 2015-01-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多