在阅读一些有关克隆对象的文献时,我遇到了这个短语
"If your object is out of the box JSON serializable"
有人可以解释一下吗?
最好有一些相反的例子(一个 n 对象的情况,它不是开箱即用的 JSON 可序列化)
最佳答案
尝试使用 Newtonsoft.Json 序列化具有 TcpClient 属性的对象:
using Newtonsoft.Json;
using System.Net.Sockets;
class A
{
public TcpClient TcpClient { get; set; } = new TcpClient();
}
var a = new A();
JsonConvert.SerializeObject(a);
它将抛出以下异常:
Error getting value from 'MulticastLoopback' on 'System.Net.Sockets.Socket'.
从 TcpClient 访问 MulticastLoopback 会引发异常:
var ml = a.TcpClient.Client.MulticastLoopback;
但是如果我们有 UdpClient:
class A
{
public UdpClient UdpClient { get; set; } = new UdpClient();
}
var a = new A();
var ml = a.UdpClient.Client.MulticastLoopback; // ok here
JsonConvert.SerializeObject(a); // Exception here
然后访问该特定属性不会失败,但会失败
var ls = a.UdpClient.Client.LingerState;
序列化会抛出异常:
Error getting value from 'LingerState' on 'System.Net.Sockets.Socket'.
UdpClient 和 TcpClient 共享公共(public)属性“.Client”,其类型为 System.Net.Sockets.Socket
该类中的一些成员仅对 TCP 连接有效,一些成员仅对 UDP 连接有效。
无法从 TCP 套接字访问 MulticastLoopback,也无法从 UDP 套接字访问 LingerState,因此 TcpClient 和 UdpClient 不是“开箱即用的 JSON 可序列化”。
编辑: 总而言之,某些类型的对象的序列化没有意义,因此它们没有被设计为可序列化。套接字类就是其中之一。
关于c# - 当 C# 对象不可 JSON 序列化时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53648837/