Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.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#_.net_Sockets_Networking_Serialization - Fatal编程技术网

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
};