Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将对象反序列化到自身_C#_.net_Xaml_Microsoft Metro - Fatal编程技术网

C# 将对象反序列化到自身

C# 将对象反序列化到自身,c#,.net,xaml,microsoft-metro,C#,.net,Xaml,Microsoft Metro,我已经找到了一些关于这个问题的线索,比如和,但是我不知道如何在我的代码中实现它 我有这样的想法: public sealed class Party { public Party() { load(); } .... public async void Load() { string fileName = this.Name + ".xml"; var files = ApplicationData.Cu

我已经找到了一些关于这个问题的线索,比如和,但是我不知道如何在我的代码中实现它

我有这样的想法:

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’,因为它是只读的”。因为我读取了一个文件,需要等待它,所以它必须是异步的,然后我不能将该类作为返回类型


关于如何将其反序列化到自身,您有什么想法吗?

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

或者具有返回参与方的静态方法(并使用该方法创建类):

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


显然,这里应该优先使用静态方法,并将其视为。

为什么不将该方法视为工厂方法来生成
方的实例呢?@48klocs工厂方法对我来说是新事物。想举个例子吗,还是你只是推荐谷歌?:)下面是我的投票,删除那个丑陋的'-1'。这是一个非常重要的问题,尽管它是不可能的。现在我觉得自己真的很愚蠢。因为“派对”实际上只有一个名字和一个列表,所以你的第二个选择非常简单。为什么你觉得它效率低下?@gubbfett因为你已经有了party对象,如果你复制了所有的数据,现在你有了2个副本,第一个副本将被垃圾收集。如果使用静态方法,您只是将其使用方式从
Party Party=new Party()
更改为
Party Party=Party.Load()
,现在它占用了一半的内存。好啊在第一个示例中,是否要解释反序列化?自从我从文件中读取以来,我刚刚找到了异步方法。使用async时,我只能有void或task。我应该将流作为全局的某个亲属还是其他什么?@gubbfett Return
Task
,并确保按如下方式使用它:
Party Party=wait Party.Load()
。您可能希望在使用该方法时将其重命名为
LoadAsync()
,因此很明显,它是一个异步方法。加载代码的其余部分保持不变,只需将最后一行更改为
返回数据
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;
}