·天新网首页·加入收藏·设为首页
首页|笔记本|手机|数码相机|摄像机|MP3/MP4|主板|内存|显示器|办公|打印机|下载|开发|汽车|学院|业界
硬件|台式机|数码|数字家庭|投影仪|GPS/CPU|显卡|硬盘|服务器|网络|一体机|驱动|源码|游戏|考试|报价
您现在的位置:天新网 > 软件开发 > .Net开发 > VC++.NET
实例解析C++/CLI的串行化
http://dev.21tx.com 2006年08月25日 天极网

1 2 3 4 下一页

  串行化可使对象被转换为某种外部的形式,比如以文件存储的形式供程序使用,或通过程序间的通讯发送到另一个处理过程。转换为外部形式的过程称为"串行化",而逆过程称为"反串行化"。

  简介
  
  请看例1中的示例,其将多个对象类型的值写入到一个新的磁盘文件中,关闭文件,接着再把这些值重新读取到内存中。

  例1:

using namespace System;
using namespace System::IO;
using namespace System::Runtime::Serialization::Formatters::Binary;

int main()
{
 array<int>^ intArray = {10, 20, 30};
 array<float,2>^ floatArray = {
  {1.2F, 2.4F},
  {3.5F, 6.8F},
  {8.4F, 9.7F}
 };
 DateTime dt = DateTime::Now;
 Console::WriteLine("dt >{0}<", dt);

 /*1*/ BinaryFormatter^ formatter = gcnew BinaryFormatter;

 //将数据串行化到一个文件

 /*2*/ Stream^ file = File::Open("Sr01.ser", FileMode::Create);

 /*3a*/ formatter->Serialize(file, "Hello");
 /*3b*/ formatter->Serialize(file, intArray);
 /*3c*/ formatter->Serialize(file, floatArray);
 /*3d*/ formatter->Serialize(file, true);
 /*3e*/ formatter->Serialize(file, dt);
 /*3f*/ formatter->Serialize(file, 1000);
 /*3g*/ formatter->Serialize(file, L'X');
 /*3h*/ formatter->Serialize(file, 1.23456F);

 /*4*/ file->Close();

 //从文件中反串行化数据--即读取数据

 /*5*/ file = File::Open("Sr01.ser", FileMode::Open);

 /*6a*/ String^ s = static_cast<String^>(formatter->Deserialize(file));
 Console::WriteLine("String >{0}<", s);

 /*6b*/ array<int>^ newIntArray =
 static_cast<array<int>^>(formatter->Deserialize(file));
 Console::WriteLine("newIntArray:");
 for (int i = 0; i < newIntArray->Length; ++i)
 {
  Console::Write(" {0}", newIntArray[i]);
 }
 Console::WriteLine();

 /*6c*/ array<float,2>^ newFloatArray =
 static_cast<array<float,2>^>(formatter->Deserialize(file));
 Console::WriteLine("newFloatArray:");
 for (int i = 0; i < 3; ++i)
 {
  for (int j = 0; j < 2; ++j)
  {
   Console::Write(" {0}", newFloatArray[i,j]);
  }
  Console::WriteLine();
 }

 /*6d*/ bool b = static_cast<bool>(formatter->Deserialize(file));
 Console::WriteLine("bool >{0}<", b);

 /*6e*/ DateTime newDT = static_cast<DateTime>(formatter->Deserialize(file));
 Console::WriteLine("newDT >{0}<", newDT);

 /*6f*/ int v = static_cast<int>(formatter->Deserialize(file));
 Console::WriteLine("int >{0}<", v);

 /*6g*/ wchar_t c = static_cast<wchar_t>(formatter->Deserialize(file));
 Console::WriteLine("wchar_t >{0}<", c);

 /*6h*/ float f = static_cast<float>(formatter->Deserialize(file));
 Console::WriteLine("float >{0}<", f);

 /*7*/ file->Close();
}

  在标记1中,我们定义了一个BinaryFormatter类型的变量,此种类型的任意对象都可以二进制的形式进行串行与反串行化。

  在标记2中,用指定的名称创建了一个新的文件,后缀 .ser没有特别的意思,这是约定俗成的表示这是一个串行化数据文件。从标记3a至3h,表示一个对象被串行化至文件中。在字符串的情况下,每个字符都被写入;在数组的情况下,所有元素都被写入;在日期时间的情况下,类型中包含的所有数据及有关依赖项都被写入;在为原始类型值的情况下,它们先被装箱,然后对应的对象被写入。上述动作中,串行化只需要接收一个Object^类型参数的对象即可。

  通过调用Deserialize函数,可取回串行化后的数据,如标记6a中所示;因为此函数返回一个Object^类型的值,所以需要把它转换为相应的值。程序的输出如插1所示:

  插1:例1中串行化、反串行化的输出

String >Hello<
newIntArray
10 20 30
newFloatArray:
1.2 2.4
3.5 6.8
8.4 9.7
bool >True<
newDT >9/29/2005 3:25:44 PM<
int >1000<
wchar_t >X<
float >1.23456<

上一篇: VC.NET实现清爽便利的Windows游戏窗口
下一篇: C++:最强大的.NET语言之可访问性

1 2 3 4 下一页

Google
 
热点文章
关于我们 | 联系我们 | 广告服务 | 工作机会 | 版权声明 | 欢迎投稿 | 网站地图
Copyright © 2000-2008 , www.21tx.com , All Rights Reserved .
© 晨新科技 版权所有 Created by TXSite.net