NetworkComms 自定义对象错误 - "objectToSerialize must implement IExplicitlySerialize"

NetworkComms custom object error - "objectToSerialize must implement IExplicitlySerialize"

当我尝试按照 NetworkComms 示例所说的那样序列化一个对象时,我从 SendObject 方法中得到了这个错误。这似乎有些愚蠢,但我不知道我需要做什么,而且我认为实现 IExplicitlySerialize 接口不是答案。这是我的调用方法和序列化的 class:

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

    }

也许您已经明白了,但对于其他在这里发现这个的人(比如我)来说。答案在这里。

该错误消息告诉您,您必须定义序列化程序。 您有一个要发送的对象,但您没有告诉 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 class 即可反序列化为。

使用 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);
}