自定义字节序列化器

时间:2015-12-17 08:12:02

标签: c# .net sockets networking serialization

我有这种类型的字典

Dictionary <byte, object> parameters = new Dictionary <byte, object> ();

我写object数据类型int, long, float等等

我需要将此列表序列化为要通过网络传输的字节数组。但问题出现了:你怎么知道object中的哪种类型? iedya记录成一个字节数组,从一个字节前缀开始,它将包含变量的类型。但是你需要首先知道对象中的类型,一旦比较类型,所有这些都会强烈地加载一个程序。也许你知道如何快速有效地序列化这本词典?

现在我有一个这样的代码:

Class BinarySerializer

public static byte [] Serialize (short value) // get an array of bytes
{
    return BitConverter.GetBytes (value);
}

类序列化的地方:

byte [] msg = new byte [256];

int offset = 0;
foreach (KeyValuePair <byte, object> pair in message.Parameters)
{
    msg [offset ++] = pair.Key;

    byte [] array = new byte [0];
    byte [] buffer;
    if (pair.Value.GetType (). Equals (typeof (short)))
    {
        msg [offset ++] = 1; // variable type
        buffer = BinarySerializer.Serialize ((short) pair.Value);
    }

    Buffer.BlockCopy (buffer, 0, msg, 0, buffer.Length);

    offset + = buffer.Length;
}

1 个答案:

答案 0 :(得分:1)

  

它的作品,但很慢。比较每个变量的类型并不好,

在这种情况下,请考虑:

switch(Type.GetTypeCode(pair.Value.GetType()))
{
    case TypeCode.Int16: // aka short
       // ...
    // etc
}

但这里出现性能问题的可能性更大的原因是分配。没有更广泛的代码背景,以及为什么你认为它很慢的证据:我们不能评论太多。

如果你想要起泡性能,那么:不要使用字典。考虑:

var obj = new {
   Name = "Fred",
   Age = 18,
   IsActive = true
};

这是一个带有命名的类型值的完全类型class。您可以使用元编程(通常是IL-emit或Expression)来有效地处理此类非常(只要您缓存生成的策略)。这就是完全开发的序列化库,如JSON.NET或protobuf-net使用的方法。