我有这种类型的字典
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;
}
答案 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使用的方法。