2010-11-28 147 views
5

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

现在,我目前的方法一直在包含在我需要保存的对象内的所有类实现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方法?或者也许这个接口甚至不是为了处理这些类。

因此,如果任何人会这么友好,并采取一些看看,也许指出我正确的方向,当涉及到这些事情的序列化。

谢谢!

回答

2

不知道这里的问题到底是什么(如果你可以发布Trade类和详细说明什么是不工作,它会有所帮助),但一般来说,如果Trade类是可序列化的,你应该能够将[Serializable]属性添加到Profile类,并且不需要通过实现ISerializable来执行自定义序列化。

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

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

+0

这是一个普遍的问题,而不是特定的东西,这只是一个示例代码片段。对不起,如果我不清楚。问题是:如果我有需要自定义序列化的类,然后该类包含也需要自定义序列化的对象,那么如何在GetObjectData方法中处理该类?或者这可能不是问题?想知道是否需要DataContractSerializer之类的东西以及类似的东西。谢谢 – vesz 2010-11-28 22:29:31