我正在努力保存更大的对象结构,其中包含我正在处理的应用程序中“项目”所需的所有数据。数据是诸如图片,流文档以及更基本的数据类型之类的东西。
现在,我目前的方法是在我需要保存的对象中包含的所有类上实现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++;
}
}
}
它带来了一个问题。填充我的List的Trade-class也实现了ISerializable。所以我很想知道:这是一个好方法吗?它甚至有用吗?我到目前为止编写的代码不起作用,我仍在尝试解决这些问题。
更具体地说,是info.AddValue(“trade”+ i,t,t.GetType());使用贸易级的ISerializable方法?或许这个界面甚至不打算处理这些类型的类。
所以,如果有人会如此善良,并且稍微看一下,并且可能会指出我在这些事物的序列化方面的正确方向。
谢谢!
答案 0 :(得分:2)
不确定这里的问题究竟是什么(如果您可以发布交易类和有关哪些不起作用的详细信息会有所帮助),但一般来说,如果Trade类是可序列化的,您应该只能添加[Serializable]属性到Profile类,不需要通过实现ISerializable来进行自定义序列化。
通常,当您需要进行自定义序列化时(例如,当您的数据成员不可序列化时),您只需要实现ISerializable。
编辑: 刚刚意识到你正在使用一个ObservableCollection,所以我以前只使用[Serializable]属性的注释是不正确的。有关序列化ObservableCollection的信息,请参阅此处:http://kentb.blogspot.com/2007/11/serializing-observablecollection.html或者您还应该能够使用ObservableCollection.CopyTo()来获取Trade []实例并将其直接添加到SerializationInfo。