打开SerializableAttribute利用里面的函数进行编辑。
1 // sparse.cpp : 定义控制台应用程序的入口点。 2 // 3 4 #include "stdafx.h" 5 #include <conio.h> 6 #using <system.dll> 7 #using <system.messaging.dll> 8 #using <System.Runtime.Serialization.Formatters.Soap.dll>//这个里面包含二进制流序列化 9 10 using namespace System; 11 using namespace System::IO; 12 using namespace System::Runtime::Serialization::Formatters::Binary; 13 // A test object that needs to be serialized. 14 15 [Serializable] 16 ref class TestSimpleObject 17 { 18 private: 19 int member1; 20 String^ member2; 21 String^ member3; 22 double member4; 23 24 public: 25 26 // A field that is not serialized. 27 28 [NonSerialized] 29 String^ member5; 30 31 TestSimpleObject() 32 { 33 member1 = 11; 34 member2 = "hello"; 35 member3 = "hello"; 36 member4 = 3.14159265; 37 member5 = "hello world!"; 38 } 39 40 void Print() 41 { 42 Console::WriteLine( "member1 = ‘ {0}‘", member1 ); 43 Console::WriteLine( "member2 = ‘ {0}‘", member2 ); 44 Console::WriteLine( "member3 = ‘ {0}‘", member3 ); 45 Console::WriteLine( "member4 = ‘ {0}‘", member4 ); 46 Console::WriteLine( "member5 = ‘ {0}‘", member5 ); 47 } 48 49 }; 50 51 int main() 52 { 53 54 //Creates a new TestSimpleObject object. 55 TestSimpleObject^ obj = gcnew TestSimpleObject; 56 Console::WriteLine( "Before serialization the Object* contains: " ); 57 obj->Print(); 58 //下面是序列化与反序列化过程 59 Stream^ stream = File::Open( "data.xml", FileMode::Create ); 60 Stream^ stream = gcnew MemoryStream(); 61 BinaryFormatter^ formatter = gcnew BinaryFormatter(); 62 formatter->Serialize( stream, obj ); 63 stream->Position = 0; 64 array<Byte>^ buffer = gcnew array<Byte>(stream->Length); //定位到stream里面的Read方法,找到Read方法在这里面该怎么用。 65 stream->Read( buffer,0,sizeof(buffer)); //使用 Read 读取数据块 66 stream->Flush(); 67 stream->Close(); 68 //Empties obj. 69 obj = nullptr; 70 71 //Opens file S"data.xml" and deserializes the object from it. 72 stream = File::Open( "data.xml", FileMode::Open ); 73 // formatter = gcnew SoapFormatter; 74 75 formatter = gcnew BinaryFormatter(); 76 obj = dynamic_cast<TestSimpleObject^>(formatter->Deserialize( stream )); 77 stream->Close(); 78 Console::WriteLine( "" ); 79 Console::WriteLine( "After deserialization the object contains: " ); 80 obj->Print(); 81 getch(); 82 return 0; 83 }
选中“解决方案”下的项目,点击“项目”-“引用”-“添加引用…”-“浏览”,现则使用的dll文件
在项目“属性”-“常规”-“公共语言运行库支持”中选择“公共语言运行库支持/clr” 。这个很重要。
在代码中使用 #using "system.dll" 来引用该动态库
使用 using namespace system; 来引用其名字空间
访问托管对象时使用“^” System::String ^hostname;可以理解为指针。托管对象的指针。
new对象时请使用 gcnew。
下面调用了.net里面的dll,然后序列化。
1 //下面是序列化过程 2 //记得一点,UDP传输的过程中是字节流。 而序列化后是二进制流,必须把二进制流再转换为字节流才可以。 3 Stream^ stream = gcnew MemoryStream(); 4 BinaryFormatter^ formatter = gcnew BinaryFormatter(); 5 formatter->Serialize( stream, obj ); 6 stream->Position = 0; 7 // Now read s into a byte buffer. 8 array<Byte>^ buffer = gcnew array<Byte>(stream->Length); //必须定义这种结构,不然,Read函数会不认识。其实是用到了.net里面的array<Byte>
//类型的元素。 9 int numBytesToRead = (int) stream -> Length; 10 int numBytesRead = 0; 11 while(numBytesToRead > 0) 12 { 13 int n = stream -> Read(buffer,numBytesRead,stream -> Length); //这里是Read函数的用法,将stream流里面的内容,写入buffer里面去。从0 位置开始写。长度stream -> Length; 14 if (n == 0) 15 { 16 break; 17 } 18 numBytesRead += n; 19 numBytesToRead -= n; 20 } 21 obj = nullptr; //释放内存 22 stream -> Close(); //关闭数据流 23 char* pointArray = new char[sizeof(buffer)]; //这是将array<Byte>类型转为char[]类型。但前提是buffer不能为指针,所以,以上的这句代码是错 的。但方法正确。
24 for(int i=0;i<sizeof(buffer);i++)
25
{
26 pointArray[i]=safe_cast<byte>(buffer[i]); // allows you to change the type of an expression and generate verifiable MSIL code.
27 }
什么是序列化?
将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。
哪些可以被序列化?
序列化分为3种:
截止至.NET 4.0总共有如下若干个序列化类
1.xml序列化 XmlSerializer
2.二进制序列化 BinaryFormatter
3.Soap序列化 SoapFormatter
4.WCF序列化 DataContractSerializer
5.Json序列化 DataContractJsonSerializer和JavascriptSerializer
强调一点:
socket 、 udp 、 tcp之间的区别。
socket只是一种套接字,就是两台电脑两端的东西,中间传输以流的格式进行。
IBEO好像是TCP/IP ,
无论对于TCP和UDP,数据都是以帧的形式,打包传输的
数据量大的情况,会多传几个包
能否在短时间内发送完,取决于带宽。也就是说,带宽越大,它在网络中进行传输的时间几乎可以忽略。费得时间主要在数据解压这块,能否实时的解压,清空缓冲区,使得积压变小,这才是关键所在。
数据量大的情况,会多传几个包
能否在短时间内发送完,取决于带宽。也就是说,带宽越大,它在网络中进行传输的时间几乎可以忽略。费得时间主要在数据解压这块,能否实时的解压,清空缓冲区,使得积压变小,这才是关键所在。
我们所说的UDP与TCP传64KB,是讲,他的每一包,或者说他的每一帧所最大携带的信息为64KB。就是说,一次所能携带的东西的数量。
可以认为是 工作量 ,然后工作速率为
1000M/s,0.6us。即传输时间为us级,几乎可以忽略不计。主要是每次最大可携带的数量是瓶颈。
然后,socket是套接字,主管两端,中间传输的协议只有两种,UDP/TCP,然后在不同的平台下,他的类是不一样的。
然后,.NET里面的也可以用UDPCLINT类来实现udp的功能。这些都是具体的类而已。千万别搞混了。