序列化包含其他ISerializable对象的ISerializable对象

ves*_*esz 5 c# serialization

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

现在,我目前的方法是在我需要保存的对象中包含的所有类上实现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++;
            }
        }
}
Run Code Online (Sandbox Code Playgroud)

它造成了一个问题.填充我的List的Trade-class也实现了ISerializable.所以我很想知道:这是一个好方法吗?它甚至有用吗?我到目前为止编写的代码不起作用,我仍在尝试解决这些问题.

更具体地说,将是info.AddValue("trade"+ i,t,t.GetType()); 使用贸易级的ISerializable方法?或许这个界面甚至不打算处理这些类型的类.

因此,如果有人会如此善良,并采取一些看法,并指出我在这些事情的序列化方面的正确方向.

谢谢!

Spe*_*ETC 2

不确定这里的问题到底是什么(如果您可以发布 Trade 类以及具体不起作用的详细信息,那将会很有帮助),但一般来说,如果 Trade 类是可序列化的,您应该能够只添加 [Serialized ] 属性添加到 Profile 类,并且不需要通过实现 ISerialized 来进行自定义序列化。

通常,只有当您需要进行自定义序列化时(例如,当您的数据成员不可序列化时),您才需要实现 ISerializable。

编辑:刚刚意识到您正在使用 ObservableCollection,所以我之前关于仅使用 [Serializable] 属性的评论是不正确的。有关序列化 ObservableCollection 的信息,请参阅此处:http://kentb.blogspot.com/2007/11/serializing-observablecollection.html或者您还应该能够使用 ObservableCollection.CopyTo() 获取 Trade[] 实例并添加该实例直接到 SerializationInfo。