序列化格式 - 二进制和 JSON 序列化
缓存数据在网络传输时需要序列化。序列化过程遍历现有对象,提取数据,并将其转换为序列化数据。然后数据通过网络传输,反序列化过程读取序列化数据。序列化/反序列化的整个过程需要很多因素,例如时间、内存和性能等。在选择序列化格式时要牢记这些因素。
备注
此功能也可用于 NCache Professional.
提供了两种类型的序列化格式 NCache:
- 二进制序列化
- JSON 序列化
备注
如果您使用的是 ASP.NET 5.0 及更高版本,建议您使用 JSON 序列化。 更多详情请点击 此处.
二进制序列化
在二进制格式中,用户对象(例如Product对象)从客户端序列化并以相同的形式存储在服务器端。 每次从服务器请求一个项目时,客户端都会收到该项目的二进制形式,然后在本地反序列化为 Product 对象。 此外,序列化/反序列化仅在客户端发生,并且在获取或添加数据时仅进行一次——在获取时进行反序列化,在添加时进行序列化。 这节省了序列化/反序列化的成本,这是显而易见的,特别是在添加或从缓存中获取大量数据的情况下。
如果大部分处理都在客户端进行,并且执行的操作包括添加、更新、获取和从缓存中删除,则二进制格式是有益的。 例如,从缓存中获取序列化的 Product 对象以显示其内容。 使用二进制格式,项目仅在到达客户端后才需要反序列化,从而将处理成本保持在最低限度。 如果使用对象格式,服务器将序列化 Product 对象并将其发送到客户端,然后客户端将其反序列化。 这增加了序列化和反序列化的总体开销和成本。
类似地,如果使用二进制格式将对象添加到缓存中,则在通过网络发送该对象之前,该对象将被序列化,并且将按原样存储。
JSON 序列化
备注
此功能可用于 NCache 企业 和 做强做精做久。.
JSON 是用于存储和交换数据的基于文本的语法。对于机器解析和用户理解来说,这是一种相当容易的格式。使用 JSON 序列化,对象在序列化时会转换为其等效的 JSON,然后在反序列化时转换回其自定义对象。
考虑一个 .NET 产品 包含产品数据的类。它包含各种属性,例如, 产品名称, 产品编号及 产品到期 等等
Product product = new Product();
product.Name = "Apple";
product.Expiry = new DateTime(2008, 12, 28);
product.Sizes = new string[] { "Small" };
此数据将被序列化为以下 JSON 字符串:
{
"Name": "Apple",
"Expiry": "2008-12-28T00:00:00",
"Sizes":
[
"Small"
]
}
使用的序列化器是 牛顿软件 第 3 方序列化器。它可能是紧凑且方便的数据序列化的优选方法。 JSON 序列化优于二进制序列化,原因如下:
内存效率: 内存是使用大型数据集时要记住的主要参数之一。较大内存的消耗会影响其他性能指标。 JSON 序列化影响存储对象的内存较少。整个数据集被序列化为 JSON,由于尺寸显着减小,因此减少了内存消耗,从而改善了网络通信。
可移植性: JSON 序列化提供了更高的可移植性,因为它使您可以轻松地将各种技术的数据序列化为同一标准。 JSON 序列化器序列化所有类型的数据。例如,如果用户使用Java类,JSON序列化器将以字符串的形式序列化数据,并将其反序列化为用户定义的类型。二进制序列化不提供这种级别的可移植性。
无代码更改: 由于按照JSON格式的序列化是完全自动化的,因此用户不需要更改代码,除非您需要根据自己的逻辑更改代码。
不可序列化的属性: 您还可以选择序列化选择性属性,并通过在类中使用名为“JsonIgnore”的方法使您选择的属性保持非序列化。这意味着序列化器在序列化数据时将忽略这些属性并序列化其余部分。这只能通过自定义类的属性来完成。请参阅 牛顿软件 文档了解详细信息。例如,如果用户想要保留属性 密码 作为非序列化,
JsonIgnore
会将其标记为不可序列化。
using Newtonsoft.Json;
[JsonIgnore]
public String Password()
{
get;
set;
}
下面给出的是具有不可序列化标记属性的自定义类的示例 密码。 序列化后,序列化的 JSON 字符串将不包含非序列化属性的值。
Account account = new Account
{
FullName = "Joe User",
EmailAddress = "joe@example.com",
Password = "VHdlZXQgJ1F1aWNrc2lsdmVyJyB0byBASmFtZXNOSw=="
};
上面的数据会被序列化为下面的 JSON 字符串。
{
"FullName":"Joe User",
"EmailAddress":"joe@example.com"
}
记住上述因素,JSON 序列化可以实现更高水平的性能。但是,如果您想获得更高级别的准确性,请使用二进制序列化而不是 JSON 序列化,因为二进制序列化数据的反序列化更准确。