c# - 当 C# 对象不可 JSON 序列化时

标签 c# json serialization

在阅读一些有关克隆对象的文献时,我遇到了这个短语

"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/

相关文章:

c# - 当 ?id= string 包含 "&"符号时,Request.QueryString[id] 不返回整个字符串

javascript - 为什么我的 javascript 对象的值未定义?

java - 为什么我的 EJB 接口(interface)需要扩展可序列化?

java - JAXB:在特殊值的情况下忽略元素序列化(例如 `null` 或 `Double.NaN` )

c# - 如何自动聚焦在后台运行的 .Net winform 应用程序

c# - LINQ 过滤基于两个属性的元素

c# - 在 MVC Controller 中打开一个 websocket channel

java - 将 JSON 字符串反序列化为具有接口(interface)数据成员的 Java 对象时出错

php - 我需要对 json_encoded 对象进行 escape_string 吗?

c# - 数据序列化 WPF