我正在使用C#.NET compact framework 2.0,因为某些条件我试图序列化我的struct对象。
因为,.NET 2.0 CF没有这个功能所以我是Marshaling对象。
我能够做到,但问题是在解开对象之后,
我得到了不同的对象价值。
下面给出了代码块:
public struct Student
{
public ushort Marks;
public uint Age;
}
////方法:
Student s;
s.Marks = 78;
s.Age = 20;
// Marshaling object 's', its success.
char[] ar = SerializeObject(s);
// Unmarshaling object back , its giving different value. For detail, pls. find the attached image.
Student s2 = DeserializeObject(ar, s);
private char[] SerializeObject(Student objMS)
{
string objStr = string.Empty;
char[] objArr = new char[2048];
int size = Marshal.SizeOf(objMS);
byte[] byteData = new byte[size];
IntPtr ptr = Marshal.AllocHGlobal(size);
Marshal.StructureToPtr(objMS, ptr, false);
Marshal.Copy(ptr, byteData, 0, size);
Marshal.FreeHGlobal(ptr);
objStr = Convert.ToBase64String(byteData);
objArr = objStr.ToCharArray();
return objArr;
}
private Student DeserializeObject(char[] objArr, Student metaStr)
{
Student objMS;
int size = Marshal.SizeOf(metaStr);
IntPtr ptr = Marshal.AllocHGlobal(size);
Marshal.Copy(objArr, 0, ptr, size);
objMS = (Student)Marshal.PtrToStructure(ptr, metaStr.GetType());
Marshal.FreeHGlobal(ptr);
return objMS;
}
如果有人能说出我在这里做错了什么,那就太好了。
答案 0 :(得分:0)
问题是Convert.ToBase64String。见下面的工作示例。另外需要注意的是,来自COM对象的char []将具有不同的编码(UTF8),在.NET中进行反序列化时需要将其考虑在内。
private static char[] SerializeObject(Student objMS)
{
string objStr = string.Empty;
int size = Marshal.SizeOf(objMS);
byte[] byteData = new byte[size];
IntPtr ptr = Marshal.AllocHGlobal(size);
Marshal.StructureToPtr(objMS, ptr, true);
Marshal.Copy(ptr, byteData, 0, size);
Marshal.FreeHGlobal(ptr);
return BitConverter.ToString(byteData).ToCharArray();
}
private static Student DeserializeObject(char[] objArr, Student metaStr)
{
int size = Marshal.SizeOf(metaStr);
IntPtr ptr = Marshal.AllocHGlobal(size);
Marshal.Copy(Encoding.UTF8.GetBytes(objArr), 0, ptr, size);
Marshal.PtrToStructure(ptr, metaStr.GetType());
Marshal.FreeHGlobal(ptr);
return metaStr;
}