Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#改进二进制序列化_C#_Binary_Unsafe_Bitconverter - Fatal编程技术网

c#改进二进制序列化

c#改进二进制序列化,c#,binary,unsafe,bitconverter,C#,Binary,Unsafe,Bitconverter,我目前正在从事一个基于其他代码生成代码的项目。本质上是将编程语言本身用作DSL 生成器目标之一是a和为以下类生成的ToBytes [DataContract] public partial class Root { [DataMember] public int Number { get; set; } [DataMember] public Partial[] Partials { get; set; } [DataMember] publi

我目前正在从事一个基于其他代码生成代码的项目。本质上是将编程语言本身用作DSL

生成器目标之一是a和为以下类生成的ToBytes

[DataContract]
public partial class Root
{
    [DataMember]
    public int Number { get; set; }

    [DataMember]
    public Partial[] Partials { get; set; }

    [DataMember]
    public IList<ulong> Numbers { get; set; }
}

因此,我看到了的实现及其使用不安全和指针来创建
字节[]
。我希望在生成的代码中使用它,如:

*byte pointer = bytes;
*((int*)pointer + pos) = Number;
pos += 4;

但在这种情况下,这将是一种不安全的方法,我不确定这会对其中更受管理的代码产生什么影响

分配和字节复制速度非常快。我的猜测是,如果您专注于代码中的其他部分,例如使用
for循环而不是
foreach
if
而不是
,则可以提高速度??Enumerable.Empty
通常是
struct
,如果您需要fast,那么winapi方法就是最好的选择。我使用了
foreach
,因为它与所有的收藏都兼容,但考虑到这一点,我可能会选择它。谢谢你的反馈。@Sinatr说实话,我不知道这件事,但它似乎不能完全涵盖我想做的事情。此外,使用结构意味着每次将其分配到某个位置时都会复制该结构。如果一个大的实例被大量传递,这将是一个性能损失,不是吗?而且在Linux/Mono上使用WinApi是行不通的,是吗?
BitConverter
不是魔术<代码>MyBitConverter.GetBytes(int,byte[]buffer,int offset)
编写起来很简单。相关:使用
unsafe
方法不会对托管代码的其余部分产生任何影响<代码>不安全!=<代码>非托管
if (index + Size > bytes.Length)
    // Some error handling
*byte pointer = bytes;
*((int*)pointer + pos) = Number;
pos += 4;