C# 自定义字节序列化程序
我有一本这种类型的字典C# 自定义字节序列化程序,c#,.net,sockets,networking,serialization,C#,.net,Sockets,Networking,Serialization,我有一本这种类型的字典 Dictionary <byte, object> parameters = new Dictionary <byte, object> (); 类,其中序列化: byte [] msg = new byte [256]; int offset = 0; foreach (KeyValuePair <byte, object> pair in message.Parameters) { msg [offset ++] = p
Dictionary <byte, object> parameters = new Dictionary <byte, object> ();
类,其中序列化:
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;
}
byte[]msg=新字节[256];
整数偏移=0;
foreach(message.Parameters中的KeyValuePair对)
{
msg[offset++]=pair.Key;
字节[]数组=新字节[0];
字节[]缓冲区;
if(pair.Value.GetType().Equals(typeof(short)))
{
msg[offset++]=1;//变量类型
buffer=BinarySerializer.Serialize((短)对.Value);
}
Buffer.BlockCopy(Buffer,0,msg,0,Buffer.Length);
偏移量+=缓冲区长度;
}
它的工作,但缓慢。每个变量的比较类型一点也不好 在这种情况下,考虑:
switch(Type.GetTypeCode(pair.Value.GetType()))
{
case TypeCode.Int16: // aka short
// ...
// etc
}
但性能问题更可能的原因是分配。如果您的代码没有更广泛的上下文,并且没有证据表明为什么您认为它很慢:我们不能多加评论
不过,如果你想获得惊人的性能,就不要使用字典。考虑:
var obj = new {
Name = "Fred",
Age = 18,
IsActive = true
};
这是一个完全类型化的
类
,具有命名的类型化值。您可以使用元编程(通常是IL emit或Expression
)非常高效地处理此类类型(只要缓存生成的策略)。这就是JSON.NET或protobuf NET等完全开发的序列化库所使用的方法。您使用BlockCopy的方式是错误的。您的源数组总是空的数组==字节[0]
对不起,这里有一点小错误。您能澄清问题是什么吗?您会问“如何知道对象中是哪种类型?”——但您已经在使用pair.Value.GetType()
,这确实是一种方法。。。我假设1;//变量类型
在反序列化期间标识它;所以什么是未知的?您可以使用一些其他方法,如is
测试,或开关(Type.GetTypeCode(…)
,但是……注意:在大多数序列化上下文中,中间方法返回字节[]
,这是一个非常糟糕的主意-这需要大量的分配等。更典型的做法是将缓冲区与偏移一起传递,(或者:传递一个流
),并让各种序列化
方法写入itIts,但速度较慢。比较每个变量的类型一点也不好,可能有更好的方法来实现这一点谢谢,我现在就试试
var obj = new {
Name = "Fred",
Age = 18,
IsActive = true
};