【发布时间】:2012-02-18 08:23:58
【问题描述】:
我一直在使用 protobuf-net 以标准 protobuf-net 方式传达对象状态数据。
我一直在序列化对象,取出一个 byte[] 数组,加密该数组并通过 UDP 将其发送出去。然后客户端获取 byte[] 数组,解密和反序列化对象,一切都很好。
我喜欢这样做,因为我们可以拥有许多数据查看器终端,这些终端可能并不总是具有最佳或最可靠的连接。
现在我需要添加一些 RPC 机制。我非常想使用相同类型的功能集(通过 UDP 序列化、加密和发射)。
我已经有了一个接口,并且连接了 WCF 和 XML-RPC。我已经研究过使用 protobuf-net 作为 WCF 端点,但我不太确定它是否是我正在寻找的。我真的很希望能够将所有内容都包含在我已经拥有的加密方案中,并重用许多其他代码。
我查看了 protobuf-net 中的基本 http RPC 示例,并一直在寻找一种方法来获取 byte[] 以供 RPC 使用。我愿意写一大段代码;我真的不知道从哪里开始。
有什么想法吗?
编辑:
这就是我通常发送状态消息的方式。这只是一些用 protobuf-net 序列化的变量
ProtoBuf.Serializer.SerializeWithLengthPrefix(mStream, Common.Share, ProtoBuf.PrefixStyle.Fixed32);
byte[] ptext2 = RNGBytes.Concat(mStream.ToArray()).ToArray();
byte[] plainTextBytes = Encoding.UTF8.GetBytes(Convert.ToBase64String(RNGBytes) + plainText);
cryptoStream.Write(ptext2, 0, ptext2.Length);
// Finish encrypting.
cryptoStream.FlushFinalBlock();
// Now we're done with the memory stream, let's turn it back into an array of bytes.
byte[] cipherTextBytes = memoryStream.ToArray();
foreach (IPEndPoint iep in BroadcastToIPs)
{
U.Send(cryptoStream.GetBuffer(), (int)mStream.Length, iep);
}
// Close both streams.
memoryStream.Close();
cryptoStream.Close();
现在我有一个界面,类似于
public interface
{
void SetMovementMode(int Axis, int Mode);
.....
}
有没有人知道如何将它包装起来并以类似的方式发送出去,并且能够对其进行加密等?
【问题讨论】:
-
我一直认为:使用 protobuf-socket-rpc Java 项目中rpc.proto 的实现类似,并使用反射将所有内容推回...但我觉得我如果我这样做,我会错过一些东西。
-
当您说“获取一个字节 [] 以供 RPC 使用”时-您能更具体一点吗?一个 byte[] 并不关心它是如何使用的......更具体地说,是什么步骤导致了头痛?您正在寻找什么用途? (我可能有一些想法,但我需要更清楚地了解问题)
-
编辑添加额外信息。
-
对;所以-我可以看到三个选项... 1:代码生成,在构建之前为您的界面编写c#; 2:元编程(即时编写接口的具体实现),以及 3:表达式树解析;我对每个步骤都有一些粗略的步骤,但是 - 优雅地做到这一点绝非易事。我确实在一段 tw 代码中有一个 bery basic RPC 服务器,可能可以对其进行调整......但是......它不是很漂亮(如果重写,我会做得非常不同)
-
是的,我对选项 #2 做了一些小尝试,但它很快变得非常不优雅,这导致了我的问题。作弊的出路是使用评论中的 rpc.proto 并进行一些反思。不是最优的,但会是一个很好的临时解决方案。
标签: encryption udp rpc protocol-buffers protobuf-net