我目前正在保存较大的对象结构,其中包含我正在处理的应用程序中“项目”所需的所有数据。数据是诸如图片,流文档以及更基本的数据类型之类的东西。

现在,我当前的方法是在需要保存的对象中包含的所有类上实现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/

10-08 22:26