实际应用中,往往需要将Voucher批量保存到磁盘文件,然后发送到业务中心。可以将每个Voucher保存为一个文件,然后将多个文件顺序传输,但这并不是一种很好的方案。
  BinnaryFormatter的Serialize方法需要传入一个Stream,这个Stream应当是可以持续写入的,因此将多个Voucher写入同一个stream中,应该是没有问题的。VoucherSerializer的BatchSerialize和BatchDeserialize方法的代码如下:
BinaryFormatter序列化实例(三)public void BatchSerialize(string filename, Voucher[] vouchers)
{
BinaryFormatter序列化实例(三)    BinaryFormatter formatter 
= new BinaryFormatter();
BinaryFormatter序列化实例(三)    FileStream fs 
= new FileStream(filename, FileMode.Create);
BinaryFormatter序列化实例(三)
BinaryFormatter序列化实例(三)    
foreach (Voucher voucher in vouchers)
{
BinaryFormatter序列化实例(三)        formatter.Serialize(fs, voucher);
BinaryFormatter序列化实例(三)    }

BinaryFormatter序列化实例(三)
BinaryFormatter序列化实例(三)    fs.Close();
BinaryFormatter序列化实例(三)}

BinaryFormatter序列化实例(三)
BinaryFormatter序列化实例(三)
public Voucher[] BatchDeserialize(string filename)
{
BinaryFormatter序列化实例(三)    BinaryFormatter formatter 
= new BinaryFormatter();
BinaryFormatter序列化实例(三)    ArrayList vouchers 
= new ArrayList();
BinaryFormatter序列化实例(三)
BinaryFormatter序列化实例(三)    FileStream fs 
= new FileStream(filename, FileMode.Open);
BinaryFormatter序列化实例(三)
BinaryFormatter序列化实例(三)    
try
{
BinaryFormatter序列化实例(三)        
while (fs.Position != fs.Length)
{
BinaryFormatter序列化实例(三)            vouchers.Add(formatter.Deserialize(fs));
BinaryFormatter序列化实例(三)        }

BinaryFormatter序列化实例(三)    }

BinaryFormatter序列化实例(三)    
finally
{
BinaryFormatter序列化实例(三)        fs.Close();
BinaryFormatter序列化实例(三)    }

BinaryFormatter序列化实例(三)
BinaryFormatter序列化实例(三)    
return (Voucher[])vouchers.ToArray(typeof(Voucher));
BinaryFormatter序列化实例(三)}

BinaryFormatter序列化实例(三)

  本文的例子使用的是FileStream,因此在Deserialize的代码中使用 fs.Position != fs.Length代表是否已读到文件尾,但在其他的Stream中,比如NetworkStream,这一逻辑需要适当修改。

  NUnit对应的测试代码如下:
BinaryFormatter序列化实例(三)[Test]
BinaryFormatter序列化实例(三)
public void TestSerializeVouchers()
{
;
BinaryFormatter序列化实例(三)
BinaryFormatter序列化实例(三)    VoucherSerializer serializer 
= new VoucherSerializer();
BinaryFormatter序列化实例(三)    serializer.BatchSerialize(
"voucher.dat", vouchers);
BinaryFormatter序列化实例(三)}

BinaryFormatter序列化实例(三)
BinaryFormatter序列化实例(三)[Test]
BinaryFormatter序列化实例(三)
public void TestDeserializeVouchers()
{
BinaryFormatter序列化实例(三)    VoucherSerializer serializer 
= new VoucherSerializer();
BinaryFormatter序列化实例(三)    Voucher[] vouchers 
= serializer.BatchDeserialize("voucher.dat");
BinaryFormatter序列化实例(三)
BinaryFormatter序列化实例(三)    Assert.AreEqual(vouchers.Length, 
2);
BinaryFormatter序列化实例(三)    Assert.AreEqual(vouchers[
0].VoucherId, "2005012900001");
BinaryFormatter序列化实例(三)    Assert.AreEqual(vouchers[
0].Creator, "xingd");
BinaryFormatter序列化实例(三)    Assert.AreEqual(vouchers[
1].VoucherId, "2005012900001");
BinaryFormatter序列化实例(三)    Assert.AreEqual(vouchers[
1].Creator, "xingd");
BinaryFormatter序列化实例(三)}

BinaryFormatter序列化实例(三)

  TestSerializeVouchers中使用了两个相同的Voucher对象测试,这样做的目的是想分析生成的voucher.data文件的内容:
BinaryFormatter序列化实例(三)

  整个文件的长度为0x01AA字节,从前半部分与后半部分(0x00000000与0x000000D5)的对比可以看出,序列化到同一个流中的多个对象是按序存储的,相互之间不会有任何影响。

相关文章:

  • 2021-06-24
  • 2022-02-24
  • 2022-12-23
  • 2021-05-17
  • 2022-12-23
  • 2021-07-26
  • 2022-02-13
  • 2022-02-07
猜你喜欢
  • 2021-11-15
  • 2021-12-13
  • 2021-07-03
  • 2022-02-22
  • 2021-08-21
  • 2022-02-07
相关资源
相似解决方案