c#改进二进制序列化
我目前正在从事一个基于其他代码生成代码的项目。本质上是将编程语言本身用作DSL 生成器目标之一是a和为以下类生成的ToBytesc#改进二进制序列化,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
[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;