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的长度:否
有几种方法可以解决这个问题:
abcdef,ghijk
”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);