在序列化过程中会出现这个报错
Newtonsoft.Json.JsonSerializationException HResult=0x80131500 Message=Error getting value from 'ScopeId' on 'System.Net.IPAddress'. Source=Newtonsoft.Json
因为我序列化的类里面包括了通讯的属性,正常情况下TCPClient不进行连接的话可以直接序列化不会报错,当client连接后在进行保存序列化就会出现项目的错误。大意就是序列化的时候会试图直接访问IPv6地址的scopeId字段、也会出现Address这个报错和Available这个属性获取不到的报错,这三种报错我在去优化代码的时候都出现了。
下面是我之前的代码保存实例:
public static Sol SaveData(string path, Sol Sol)
{
try
{
JsonSerializer serializer = new JsonSerializer();
//添加了转换器
serializer.Converters.Add(new TcpClientConverter());
serializer.NullValueHandling = NullValueHandling.Ignore;
serializer.TypeNameHandling = TypeNameHandling.Auto;
serializer.Formatting = Formatting.Indented;
using (StreamWriter sw = new StreamWriter(path))
{
using (JsonWriter writer = new JsonTextWriter(sw))
{
serializer.Serialize(writer, solToSave);
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Hand);
}
finally
{
mProjSave = true;
AddLog.Info("项目:" + Sol.Name + "保存成功! " + path);
GC.Collect();
}
return Sol;
}
这里面之前是没添加转换器,因为报错ScopeId就找了一个帖子发现他的问题和我一样我就试了一下,参考链接:Json.Net - Error getting value from ‘ScopeId‘ on ‘System.Net.IPAddress‘-CSDN博客
转换器加上之后就会报领一个错误出现 "Error getting value from 'Available' on 'System.Net.Sockets.Socket'"
的错误,可能是由于在尝试关闭或操作 Socket
时,Socket
已经被关闭或者处于不稳定状态。这个错误通常与 Socket
的访问有关,比如在关闭后仍然尝试访问某个属性。设置了 [JsonIgnore]
和自定义的 JsonConverter
,并且仍然遇到 ObjectDisposedException
,这可能意味着序列化过程中仍然有其他不易察觉的对象在访问 TcpClient
或 Socket
的属性
然后我就没在这个思路是继续折腾了,转变了一个方式:在序列化保存的时候直接将保存的通讯对象的相关属性设置为空,在反序列化的时候直接根据它们之前的连接bool值进行一个动态的加载,这样就可解决上面所遇到的那些问题了
public static Sol RemoveTcpClients(Sol sol)
{
foreach (var ecom in sol.mEComList)
{
ecom.m_DMTcpClient = null; // 手动清空 TcpClient
ecom.m_DMTcpServer = null;
ecom.m_DMUdpClient = null;
ecom.m_MySerialPort = null;
}
return sol;
}
/// <summary> 保存项目</summary>
public static Sol SaveData(string path, Sol Sol)
{
try
{
// 手动移除 TcpClient 和其他网络相关对象
var solToSave = RemoveTcpClients(Sol);
JsonSerializer serializer = new JsonSerializer();
serializer.Converters.Add(new TcpClientConverter());
serializer.NullValueHandling = NullValueHandling.Ignore;
serializer.TypeNameHandling = TypeNameHandling.Auto;
serializer.Formatting = Formatting.Indented;
using (StreamWriter sw = new StreamWriter(path))
{
using (JsonWriter writer = new JsonTextWriter(sw))
{
serializer.Serialize(writer, solToSave);
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Hand);
}
finally
{
mProjSave = true;
AddLog.Info("项目:" + Sol.Name + "保存成功! " + path);
GC.Collect();
}
return Sol;
}