zoukankan      html  css  js  c++  java
  • 自定义序列化技术3 (.net 序列化技术) C++ 调用C# DLL

    打开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的功能。这些都是具体的类而已。千万别搞混了。
     
    意味着一件事情,那就是我们搞雷达速度都被雷达本身的速率给限制住了,无法施展开来。
     
     
     
  • 相关阅读:
    Word如何去水印
    计算机二级公共基础知识 #02
    计算机二级公共基础知识 #01
    Linux常用快捷键
    计算机二级C语言概述 #00
    信管专业的同学都进来看一看叭~~~~~
    Python--Hanoi塔问题
    MATLAB——实验一:查看图像的RGB值
    Python课 #06号作业
    Python课 #05号作业
  • 原文地址:https://www.cnblogs.com/zhuxuekui/p/3516697.html
Copyright © 2011-2022 走看看