求教Marshal类实现序列化出现的有关问题
求教Marshal类实现序列化出现的问题
小弟最近在研究利用Marshal实现序列化和反系列化,主要是使用Marshal类里的两个方法,StructureToPtr和PtrToStructure,这两个类的具体讲解和用法我就不多赘述 了,具体见http://blog.****.net/wem520/article/details/9101549,下面说我碰到的问题,我的需求是对一个类的对象通过StructureToPtr序列化成byte[]数组,然后通过TCP Socket传输到另外一个解决方案,再用PtrToStructure反序列化出来这个对象。现在的问题是类的字段类型问题,就是我一个属性是string类型,其余的都是int类型。测试结果发现如果在同一个API里,这个方法能完美实现,但是经过传输再反序列化后int类型可以反序列化出来而string字段就为空或者乱码。小弟百思不得其解,特来求高手帮忙分析解疑。具体代码如下:
API直接序列化反序列化
小弟最近在研究利用Marshal实现序列化和反系列化,主要是使用Marshal类里的两个方法,StructureToPtr和PtrToStructure,这两个类的具体讲解和用法我就不多赘述 了,具体见http://blog.****.net/wem520/article/details/9101549,下面说我碰到的问题,我的需求是对一个类的对象通过StructureToPtr序列化成byte[]数组,然后通过TCP Socket传输到另外一个解决方案,再用PtrToStructure反序列化出来这个对象。现在的问题是类的字段类型问题,就是我一个属性是string类型,其余的都是int类型。测试结果发现如果在同一个API里,这个方法能完美实现,但是经过传输再反序列化后int类型可以反序列化出来而string字段就为空或者乱码。小弟百思不得其解,特来求高手帮忙分析解疑。具体代码如下:
API直接序列化反序列化
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
namespace ConsoleApplication5
{
class Program
{
static void Main(string[] args)
{
Person p = new Person();
p.name = "joseph";
p.age = 18;
p.high = 188;
p.kg = 143;
p.tel = 15689;
byte[] bs = StructToBytes(p);
Person2 py2 = (Person2)BytesToStruct(bs, typeof(Person2));
Console.ReadKey();
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
public class Person
{
public string name { get; set; }
public int age { get; set; }
public int high { get; set; }
public int kg { get; set; }
public int tel { get; set; }
}
//1、struct转换为Byte[]
public static Byte[] StructToBytes(Object structure)
{
Int32 size = Marshal.SizeOf(structure);
IntPtr buffer = Marshal.AllocHGlobal(size);
try
{
Marshal.StructureToPtr(structure, buffer, false);
Byte[] bytes = new Byte[size];
Marshal.Copy(buffer, bytes, 0, size);
return bytes;
}
finally
{
Marshal.FreeHGlobal(buffer);
}
}
//2、Byte[]转换为struct
public static Object BytesToStruct(Byte[] bytes, Type strcutType)
{
Int32 size = Marshal.SizeOf(strcutType);
IntPtr buffer = Marshal.AllocHGlobal(size);
try
{
Marshal.Copy(bytes, 0, buffer, size);
return Marshal.PtrToStructure(buffer, strcutType);
}
finally
{
Marshal.FreeHGlobal(buffer);
}
}
}
}