技术开发 频道

持久化对象集合


【IT168技术文档】

  现在已经看到了如何将一个对象持久化为一个流,下面检验如何保存一组对象。读者可能注意到了,IFormatter接口中的Serialize()方法不提供指定任意数量对象的方法(只能是单个的System.Object)。相关的是,Deserialize()方法的返回值一样也是单个的System.Object:
public interface IFormatter { object Deserialize(System.IO.Stream serializationStream); void Serialize(System.IO.Stream serializationStream, object graph); }
  回想一下,System.Object实际上表现了一个完整的对象图。基于此,如果你传递进来一个被标记为[Serializable]的对象并且还包含了其他[Serializable]对象,整个对象集可以立刻被持久化。幸运的是,大多数在System.Collections和System.Collections.Generic命名空间内的类型已经被标记为[Serializable]。因此,如果你希望对一组对象进行持久化,只需要添加这组对象到容器(比如ArrayList或List<>)中并序列化对象为你选择的流就可以了。

  假设已经用一个双参数构造函数更新了JamesBondCar类用来设置一些状态数据(注意已按照XmlSerializer的要求把默认的构造函数加了回去):
[Serializable, XmlRoot(Namespace = "http://www.intertechtraining.com")] public class JamesBondCar : Car { public JamesBondCar(bool skyWorthy, bool seaWorthy) { canFly = skyWorthy; canSubmerge = seaWorthy; } // XmlSerializer需要一个默认的构造函数! public JamesBondCar(){} ... }
  有了这些,就可以按照以下方式持久化任何数目的JamesBondCars:
static void Main(string[] args) { ... // 现在持久化一个JamesBondCar的List<>。 List<JamesBondCar> myCars = new List<JamesBondCar>(); myCars.Add(new JamesBondCar(true, true)); myCars.Add(new JamesBondCar(true, false)); myCars.Add(new JamesBondCar(false, true)); myCars.Add(new JamesBondCar(false, false)); fStream = new FileStream("CarCollection.xml", FileMode.Create, FileAccess.Write, FileShare.None); xmlFormat = new XmlSerializer(typeof(List<JamesBondCar>), new Type[] { typeof(JamesBondCar), typeof(Car), typeof(Radio) }); xmlFormat.Serialize(fStream, myCars); fStream.Close(); Console.ReadLine(); }
0
相关文章