我目前正在保存较大的对象结构,其中包含我正在处理的应用程序中“项目”所需的所有数据。数据是诸如图片,流文档以及更基本的数据类型之类的东西。
现在,我当前的方法是在需要保存的对象中包含的所有类上实现ISerializable。但是,当:
public class Profile : ISerializable
{
public ObservableCollection<Trade> Trades { get; set; }
public Profile() {}
public Profile(SerializationInfo info, StreamingContext context)
: this()
{
foreach (SerializationEntry entry in info)
{
if (entry.Name.StartsWith("trade"))
{
Type t = entry.ObjectType;
Trades.Add(entry.Value as Trade);
}
}
}
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
int i = 0;
foreach (Trade t in Trades)
{
info.AddValue("trade" + i, t, t.GetType());
i++;
}
}
}
这带来了一个问题。填充我的列表的Trade-class也实现ISerializable。所以我想知道的是:这是一个好方法吗?还能用吗?到目前为止,我编写的代码无法正常工作,但我仍在尝试解决问题。
更具体地说,info.AddValue(“trade” + i,t,t.GetType());使用贸易类的ISerializable方法?也许这个接口(interface)甚至都不打算处理这些类型的类。
因此,如果有人这么善良,请稍微看一眼,甚至可以将有关这些内容的序列化指向我正确的方向。
谢谢!
最佳答案
不知道这里到底是什么问题(如果您可以发布Trade类,并提供有关确切不起作用的详细信息会有所帮助),但是通常,如果Trade类是可序列化的,则应该只需添加[Serializable ]属性分配给Profile类,并且不需要通过实现ISerializable进行自定义序列化。
通常,仅在需要执行自定义序列化时(例如,数据成员不可序列化时)才需要实现ISerializable。
编辑:
刚刚意识到您正在使用ObservableCollection,所以我之前仅使用[Serializable]属性的评论是不正确的。有关序列化ObservableCollection的信息,请参见此处:http://kentb.blogspot.com/2007/11/serializing-observablecollection.html,或者您也应该能够使用ObservableCollection.CopyTo()获得Trade []实例并将其直接添加到SerializationInfo中。
关于c# - 序列化包含其他ISerializable对象的ISerializable对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4299380/