gpt4 book ai didi

C# - 结构序列化

转载 作者:太空宇宙 更新时间:2023-11-03 23:41:26 25 4
gpt4 key购买 nike

我有一个小类,我想用它来序列化结构。我想知道两件事:

  • 性能问题。因为我正在传递 Object - 它只传递一个引用,而不是结构的副本?而且由于我要返回 T 类型的对象,它也只传递一个引用吗?

  • 正确性问题。此序列化是否适用于所有结构?我的意思是 - 是否有可能这些方法不起作用?

    public static byte[] ToByteArray(Object obj)
    {
    int size = Marshal.SizeOf(obj);
    byte[] arr = new byte[size];
    IntPtr ptr = Marshal.AllocHGlobal(size);

    Marshal.StructureToPtr(obj, ptr, true);
    Marshal.Copy(ptr, arr, 0, size);
    Marshal.FreeHGlobal(ptr);

    return arr;
    }

    public static T ToStructure<T>(byte[] arr) where T : new()
    {
    T str = new T();

    int size = Marshal.SizeOf(str);
    IntPtr ptr = Marshal.AllocHGlobal(size);

    Marshal.Copy(arr, 0, ptr, size);
    str = (T)Marshal.PtrToStructure(ptr, str.GetType());
    Marshal.FreeHGlobal(ptr);

    return str;
    }

谢谢大家!

编辑

我现在指定这些是结构。现在没有复制任何内容?

    public static byte[] ToByteArray<T>(ref T str) where T : struct
{
int size = Marshal.SizeOf(str);
byte[] arr = new byte[size];
IntPtr ptr = Marshal.AllocHGlobal(size);

Marshal.StructureToPtr(str, ptr, true);
Marshal.Copy(ptr, arr, 0, size);
Marshal.FreeHGlobal(ptr);

return arr;
}

public static T ToStructure<T>(byte[] arr) where T : struct
{
T str = default(T);

int size = Marshal.SizeOf(str);
IntPtr ptr = Marshal.AllocHGlobal(size);

Marshal.Copy(arr, 0, ptr, size);
str = (T)Marshal.PtrToStructure(ptr, str.GetType());
Marshal.FreeHGlobal(ptr);

return str;
}

最佳答案

  1. 这不会正确序列化引用(即任何非原始和非结构类型的字段)。
  2. 它不包括类型数据
    • 这使得它不适用于事先不知道所有类型或某些类型自序列化时间以来略有变化的情况。
  3. (次要)ToStructure 不验证二进制数据

为什么不在重新发明轮子之前了解现有的解决方案?Serialization Guidelines 文章说在 .NET 框架中实现了 3 种序列化技术,它们具有不同的特性并且针对不同的目的量身定制。 p>

这是 Object Serialization in .NET 文章中作为示例给出的最简单的第三种技术的示例。它的存在是为了重建一个与原始对象具有完全相同类型和内部数据的对象(这意味着,序列化包括它引用的对象)。
(代码在 IronPython 中,但我希望它具有足够的可读性以理解发生了什么)

>>> l=System.Collections.Generic.List[System.Drawing.Point]\
([System.Drawing.Point(*(random.randint(1,1000) for _ in range(2))) for _ in range(5)])
>>> l
List[Point]([<System.Drawing.Point object at 0x0000000000000233 [{X=491,Y=874}]>
, <System.Drawing.Point object at 0x0000000000000234 [{X=819,Y=595}]>, <System.D
rawing.Point object at 0x0000000000000235 [{X=456,Y=625}]>, <System.Drawing.Poin
t object at 0x0000000000000236 [{X=583,Y=29}]>, <System.Drawing.Point object at
0x0000000000000237 [{X=329,Y=212}]>])
>>> szr=System.Runtime.Serialization.Formatters.Binary.BinaryFormatter()
>>> stm=System.IO.MemoryStream()
>>> szr.Serialize(stm,l)
>>> stm.Length
481L
>>> bytes=stm.GetBuffer()
>>> s=''.join(chr(b) for b in bytes)
>>> s
u'\x00\x01\x00\x00\x00\xff\xff\xff\xff\x01\x00\x00\x00\x00\x00\x00\x00\x0c\x02\x
00\x00\x00QSystem.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f
5f7f11d50a3a\x04\x01\x00\x00\x00\x8c\x01System.Collections.Generic.List`1[[Syste
m.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToke
n=b03f5f7f11d50a3a]]\x03\x00\x00\x00\x06_items\x05_size\x08_version\x04\x00\x00\
x16System.Drawing.Point[]\x02\x00\x00\x00\x08\x08\t\x03\x00\x00\x00\x05\x00\x00\
x00\x00\x00\x00\x00\x07\x03\x00\x00\x00\x00\x01\x00\x00\x00\x05\x00\x00\x00\x04\
x14System.Drawing.Point\x02\x00\x00\x00\x05\xfc\xff\xff\xff\x14System.Drawing.Po
int\x02\x00\x00\x00\x01x\x01y\x00\x00\x08\x08\x02\x00\x00\x00\xeb\x01\x00\x00j\x
03\x00\x00\x01\xfb\xff\xff\xff\xfc\xff\xff\xff3\x03\x00\x00S\x02\x00\x00\x01\xfa
\xff\xff\xff\xfc\xff\xff\xff\xc8\x01\x00\x00q\x02\x00\x00\x01\xf9\xff\xff\xff\xf
c\xff\xff\xffG\x02\x00\x00\x1d\x00\x00\x00\x01\xf8\xff\xff\xff\xfc\xff\xff\xffI\
x01\x00\x00\xd4\x00\x00\x00\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'

关于C# - 结构序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28915076/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com