如何将字符串数组转换回Process数组?附服务端与接收端代码
如何将进程字符串数组转回Process[]?
嘿,你现在的思路有个关键误区:Process.ToString()返回的只是进程的文本描述,不是可反序列化的结构化数据。比如你拿到的字符串可能是"System.Diagnostics.Process (notepad)",这种文本里没有重建Process实例需要的核心信息(比如进程ID、运行状态),所以直接拆分字符串根本没法转回Process[]。
下面给你两种可行的解决方案,从简单到更健壮:
方案一:传输进程关键标识(ID+名称),接收端重新获取进程
服务端修改代码
不要直接序列化Process.ToString(),而是提取进程的唯一标识(进程ID和名称)来拼接字符串:
var processlist = Process.GetProcesses(); // 用|分隔单个进程的ID和名称,用,分隔不同进程(选|是因为进程名不会包含这个字符) string sendata = string.Join(",", processlist.Select(p => $"{p.Id}|{p.ProcessName}")); writer.WriteLine(sendata); writer.Flush();
接收端处理代码
拆分字符串后,根据进程ID去本地系统中获取对应的Process实例,同时验证进程名避免ID复用的问题:
string[] split = response.Split(','); List<Process> processList = new List<Process>(); foreach (string processInfo in split) { if (string.IsNullOrWhiteSpace(processInfo)) continue; string[] parts = processInfo.Split('|'); if (parts.Length != 2) continue; if (int.TryParse(parts[0], out int processId)) { try { Process process = Process.GetProcessById(processId); // 验证进程名,防止进程ID被系统复用 if (process.ProcessName.Equals(parts[1], StringComparison.OrdinalIgnoreCase)) { processList.Add(process); } } catch (ArgumentException) { // 进程已退出或不存在,跳过 continue; } catch (InvalidOperationException) { // 无权限访问该进程,跳过 continue; } } } Process[] result = processList.ToArray();
方案二:用JSON序列化结构化数据(更健壮)
如果需要传输更多进程信息,或者怕分隔符冲突,推荐用JSON序列化进程的DTO(数据传输对象):
服务端代码
先定义一个简单的DTO类,然后序列化:
// 定义进程传输类 public class ProcessDto { public int Id { get; set; } public string ProcessName { get; set; } public string MainWindowTitle { get; set; } } // 序列化发送 var processlist = Process.GetProcesses(); var processDtos = processlist.Select(p => new ProcessDto { Id = p.Id, ProcessName = p.ProcessName, MainWindowTitle = p.MainWindowTitle }); string sendata = System.Text.Json.JsonSerializer.Serialize(processDtos); writer.WriteLine(sendata); writer.Flush();
接收端代码
反序列化后,再根据ID获取本地进程:
// 同样需要定义ProcessDto类 var processDtos = System.Text.Json.JsonSerializer.Deserialize<List<ProcessDto>>(response); List<Process> processList = new List<Process>(); foreach (var dto in processDtos) { try { Process process = Process.GetProcessById(dto.Id); if (process.ProcessName.Equals(dto.ProcessName, StringComparison.OrdinalIgnoreCase)) { processList.Add(process); } } catch (Exception) { // 处理异常,跳过无效进程 continue; } } Process[] result = processList.ToArray();
重要注意事项
- 进程ID是可复用的:如果服务端发送后,某个进程退出了,系统可能把这个ID分配给新进程,所以验证进程名很有必要。
- 跨机器限制:如果接收端和服务端不是同一台机器,
Process.GetProcessById无法直接获取远程进程,这时需要用WMI或者远程管理API来实现。
内容的提问来源于stack exchange,提问作者Adrian Rudy Dacka
相关产品推荐
相关产品推荐

