Networkcomms.net库发送自定义类

几天前我开始在C#中使用这个库 。 当我遇到错误时,我试图发送自定义类,这是我的代码:

Main.cs

  private void button3_Click(object sender, EventArgs e) { listBox1.Items.Add("Sending message to server saying '" + textBox2.Text + "'"); TCPConnection connection = TCPConnection.GetConnection(new ConnectionInfo(serverIP, serverPort)); SendReceiveOptions options = connection.ConnectionDefaultSendReceiveOptions.Clone() as SendReceiveOptions; options.DataProcessors.Add(DPSManager.GetDataProcessor()); RijndaelPSKEncrypter.AddPasswordToOptions(options.Options, "Your strong PSK"); if (connection.SendReceiveObject("Payload", "Ack", 1000, new PayloadFile(textBox2.Text)) != null) // <-- Giving an exception here, "Type is not expected, and no contract can be inferred: TCP_Client.PayloadFile" { listBox1.Items.Add("Done"); } } 

PayloadFile.cs

 public class PayloadFile { public string FileName; public string FileLocation; public FileStream FileContent; public PayloadFile(string FileToLoad) { if (!File.Exists(FileToLoad)) { throw new FileNotFoundException(); } FileInfo PayloadInfo = new FileInfo(FileToLoad); FileName = PayloadInfo.Name; FileLocation = PayloadInfo.DirectoryName; FileContent = File.OpenRead(FileToLoad); } } 

消息引发的exception:

 Type is not expected, and no contract can be inferred: TCP_Client.PayloadFile 

我怀疑这堂课被错误写了?

您需要使用ProtoBuffer属性来装饰您的类以使其工作。 我使用以下从示例中获取的服务器脚本进行了一些测试。 此外,您无法序列化流对象,您需要使用字节数组。

 void Main() { //Trigger the method PrintIncomingMessage when a packet of type 'Message' is received //We expect the incoming object to be a string which we state explicitly by using  NetworkComms.AppendGlobalIncomingPacketHandler("Payload", PrintIncomingMessage); //Start listening for incoming connections TCPConnection.StartListening(true); //Print out the IPs and ports we are now listening on Console.WriteLine("Server listening for TCP connection on:"); foreach (System.Net.IPEndPoint localEndPoint in TCPConnection.ExistingLocalListenEndPoints()) Console.WriteLine("{0}:{1}", localEndPoint.Address, localEndPoint.Port); //Let the user close the server Console.WriteLine("\nPress any key to close server."); Console.ReadLine(); //We have used NetworkComms so we should ensure that we correctly call shutdown NetworkComms.Shutdown(); } ///  /// Writes the provided message to the console window ///  /// The packetheader associated with the incoming message /// The connection used by the incoming message /// The message to be printed to the console private static void PrintIncomingMessage(PacketHeader header, Connection connection, PayloadFile message) { connection.SendObject("Ack", "Ok"); Console.WriteLine("\nA message was recieved from " + connection.ToString() + " which said '" + message + "'."); } // Define other methods and classes here [ProtoContract] public class PayloadFile { [ProtoMember(1)] public string FileName { get; set; } [ProtoMember(2)] public string FileLocation { get; set; } [ProtoMember(3)] public byte[] FileContent { get; set; } public PayloadFile() { } public override string ToString() { var sb = new StringBuilder(); sb.AppendLine(string.Format("FilaName: {0}", FileName)); sb.AppendLine(string.Format("FileLocation: {0}", FileLocation)); sb.AppendLine(string.Format("FileContent: {0}", System.Text.Encoding.UTF8.GetString(FileContent))); return sb.ToString(); } } 

而这个脚本为客户端

 void Main() { var serverIP = "::1"; var serverPort = 10000; TCPConnection connection = TCPConnection.GetConnection(new ConnectionInfo(serverIP, serverPort)); SendReceiveOptions options = connection.ConnectionDefaultSendReceiveOptions.Clone() as SendReceiveOptions; options.DataProcessors.Add(DPSManager.GetDataProcessor()); RijndaelPSKEncrypter.AddPasswordToOptions(options.Options, "Your strong PSK"); if (connection.SendReceiveObject("Payload", "Ack", 1000, new PayloadFile("c:\\CONFIGURACAO.INI")) != null) { Console.WriteLine("Done"); } } [ProtoContract] public class PayloadFile { [ProtoMember(1)] public string FileName { get; set; } [ProtoMember(2)] public string FileLocation { get; set; } [ProtoMember(3)] public byte[] FileContent { get; set; } public PayloadFile() { } public PayloadFile(string FileToLoad) { if (!File.Exists(FileToLoad)) { throw new FileNotFoundException(); } FileInfo PayloadInfo = new FileInfo(FileToLoad); FileName = PayloadInfo.Name; FileLocation = PayloadInfo.DirectoryName; using (var stream = File.OpenRead(FileToLoad)) { FileContent = unchecked((new BinaryReader(stream)).ReadBytes((int)stream.Length)); } } }