当我尝试序列化对象时,我从SendObject方法中得到此错误,就像NetworkComms示例所说的那样。这看起来很傻,但我无法弄清楚我需要做什么,我不认为实现IExplicitlySerialize接口是答案。这是我的调用方法和序列化类:
public static void SendTestPacket()
{
var message = "This is a test packet";
NetworkComms.SendObject("PacketPrintToConsole", "192.168.1.105", 5614, new PacketPrintToConsole(message));
}
[ProtoContract]
public class PacketPrintToConsole
{
[ProtoMember(1)]
public string Message { get; set; }
public PacketPrintToConsole() { }
public PacketPrintToConsole(string message)
{
this.Message = message;
}
}
答案 0 :(得分:4)
也许你已经弄清楚了,但是对于其他人在这里找到这个(像我一样)。这是答案。
该错误消息告诉您,您必须定义序列化程序。 您有一个想要发送的对象,但是您没有告诉NetworkComms要使用的序列化程序。 因此,您可以在对象中实现IExplicitlySerialize,也可以使用已为protobuf-net创建的序列化程序。
您需要使用 NetworkCommsDotNet.DPSBase.ProtobufSerializer 。 您必须引用从您可以在github上获得的NetworkComms源编译的ProtobufSerializer.dll,然后定义SendReceiveOptions。
示例:
SendReceiveOptions customSendReceiveOptions = new SendReceiveOptions<ProtobufSerializer>();
ConnectionInfo connectionInfo = new ConnectionInfo("192.168.1.105", 5614);
TCPConnection serverConnection = TCPConnection.GetConnection(connectionInfo, customSendReceiveOptions);
var message = "This is a test packet";
serverConnection.SendObject("PacketPrintToConsole", new PacketPrintToConsole(message));
只需要将对象序列化为要发送的位置即可。 接收客户端只需要使用具有相同对象类的protobuf-net进行反序列化。
使用SendReceiveObject请求消息的示例。
SendReceiveOptions customSendReceiveOptions = new SendReceiveOptions<ProtobufSerializer>();
NetworkComms.AppendGlobalIncomingPacketHandler<int>("GetMessage", GetMessageRequest, customSendReceiveOptions);
发送结果的方法:
private static void GetMessageRequest(PacketHeader packetheader, Connection connection, int incomingobject)
{
connection.SendObject("MessageReply", new MessageObject(message));
}
然后在客户端:
ConnectionInfo connectionInfo = new ConnectionInfo("192.168.2.105", 5614);
TCPConnection serverConnection = TCPConnection.GetConnection(connectionInfo);
MessageObject myMessageObject = serverConnection.SendReceiveObject<ImageWrap>("GetMessage", "MessageReply", 1000);
if (myMessageObject != null)
{
Console.WriteLine(myMessageObject.Message);
}