封送对象返回不同的值

时间:2016-03-30 11:38:27

标签: c# compact-framework marshalling

我正在使用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;
            }

如果有人能说出我在这里做错了什么,那就太好了。

1 个答案:

答案 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;
        }