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 ReturnTask
,并确保按如下方式使用它: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;
}