C# 序列化手动编写的代码

C# 序列化手动编写的代码,c#,.net,winforms,serialization,client-server,C#,.net,Winforms,Serialization,Client Server,我从客户端接收文件时遇到问题。有人建议我应该使用二进制序列化在流中发送和接收消息。你能给我一些关于我应该如何连载这篇文章的想法吗?不久前我刚刚了解了序列化,所以我对如何将它与我的程序关联感到非常困惑 这是“应该”序列化的客户端 public void sendthedata() { if (!_timer.Enabled) // If timer is not running send data and start refresh interval

我从客户端接收文件时遇到问题。有人建议我应该使用二进制序列化在流中发送和接收消息。你能给我一些关于我应该如何连载这篇文章的想法吗?不久前我刚刚了解了序列化,所以我对如何将它与我的程序关联感到非常困惑

这是“应该”序列化的客户端

 public void sendthedata()
        {
            if (!_timer.Enabled) // If timer is not running send data and start refresh interval
            {
                SendData();
                _timer.Enabled = true;
            }
            else // Stop timer to prevent further refreshing
            {
                _timer.Enabled = false;
            }
        }
        private List<int> listedProcesses = new List<int>();
        private void SendData()
        {
            String processID = "";
            String processName = "";
            String processPath = "";
            String processFileName = "";
            String processMachinename = "";

            listBox1.BeginUpdate();
            try
            {   
                piis = GetAllProcessInfos();
                for (int i = 0; i < piis.Count; i++)
                {
                    try
                    {
                        if (!listedProcesses.Contains(piis[i].Id)) //placed this on a list to avoid redundancy
                        {
                            listedProcesses.Add(piis[i].Id);
                            processID = piis[i].Id.ToString();
                            processName = piis[i].Name.ToString();
                            processPath = piis[i].Path.ToString();
                            processFileName = piis[i].FileName.ToString();
                            processMachinename = piis[i].Machinename.ToString();
                            output.Text += "\n\nSENT DATA : \n\t" + processFileName + "\n\t" + processMachinename + "\n\t" + processID + "\n\t" + processName + "\n\t" + processPath + "\n";
                        }

                    }
                    catch (Exception ex)
                    {
                        wait.Abort();
                        output.Text += "Error..... " + ex.StackTrace;

                    }

                    NetworkStream ns = tcpclnt.GetStream();
                    String data = "";
                    data = "--++" + processFileName + " " +  processMachinename + " "  + processID + " " + processPath;
                    if (ns.CanWrite)
                    {
                        byte[] bf = new ASCIIEncoding().GetBytes(data);
                        ns.Write(bf, 0, bf.Length);
                        ns.Flush();
                    }
                }
            }
            finally
            {
                listBox1.EndUpdate();
            } 
        }

谢谢。

序列化一段数据时,有几条规则需要遵循。 将数据转换为字节很容易,但是考虑如何在另一侧重建数据。假设服务器不知道您发送了什么

在序列化程序中,只需将两个字符串转换为一个字节[],然后将其发送过来。例如:

string x = "abcdef";
string y = "ghijk";

var bytes = Encoding.Ascii.GetBytes(x + y);
服务器收到:
“abcdefghijk”

服务器是否可以确定和重构字符串x和y? 因为服务器不知道x和y的长度:否

有几种方法可以解决这个问题:

  • 使用固定长度字段。在我的示例中,x的长度应该始终为6个字符,y的长度应该始终为5个字符。然后,在服务器上解码就变得非常简单

    字符串x=数据。子字符串(0,6) 字符串y=数据。子字符串(6,5)

  • 在字段之间使用分隔符。如果您熟悉cvs,则“,”会拆分字段。然而,这也有它的缺点,如何处理字符串中某处的“,”呢?发送的数据类似于“
    abcdef,ghijk

  • 在字段内容之前发送每个字段的大小。 一种简单明了的方法:字符串x将作为“
    6abcdef
    ”发送,y作为“
    5ghijk
    ”发送

  • 用手做这些事情可能会变得非常毛茸茸的,这是我真正需要考虑的事情。

    我会求助于在这方面做得很好的现有框架:

    在本例中,我将首先创建一个类来定义发送到服务器的数据,而不是一堆字符串:

    class ProcessInfo{
        public string ProcessID {get;set;}
        public string ProcessName {get;set;}
        public string ProcessPath {get;set;}
        public string ProcessFileName {get;set;}
        public string ProcessMachinename {get;set;}
    };
    
    使用Json将其序列化:

    var procinfo = new ProcessInfo{
                       ProcessId = "1",
                       ...
                   };
    var serialised = JsonConvert.SerializeObject(procinfo);
    var bytes = Encoding.Utf8.GetBytes(serialised);
    ns.Write(bytes, 0, bytes.Length);
    
    并通过以下方式将其恢复到服务器上:

    var procInfo = JsonConvert.DeserializeObject<ProcessInfo>(json);
    
    var procInfo=JsonConvert.DeserializeObject(json);
    
    json会是一个不同的文件吗?json是否有一个名称空间,或者可以直接编码到windows窗体中?使用nuget:Install包Newtonsoft.Jsonhmm.怎么样。。我真的不知道json,但我会调查一下。
    var procInfo = JsonConvert.DeserializeObject<ProcessInfo>(json);