将对象反序列化为自身
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.
我找到了一些关于这个问题的线索,比如 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.