.netcore8序列化Tcp报错:Json.Net - Error getting value from ‘ScopeId‘ on ‘System.Net.IPAddress‘

在序列化过程中会出现这个报错

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,这可能意味着序列化过程中仍然有其他不易察觉的对象在访问 TcpClientSocket 的属性

然后我就没在这个思路是继续折腾了,转变了一个方式:在序列化保存的时候直接将保存的通讯对象的相关属性设置为空,在反序列化的时候直接根据它们之前的连接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;
 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值