設(shè)計(jì)強(qiáng)大的 API 的一個(gè)關(guān)鍵方面是能夠以各種格式返回響應(yīng),以滿足不同的客戶端需求。在 API 的上下文中,序列化和反序列化對于客戶端和服務(wù)器之間的數(shù)據(jù)交換至關(guān)重要。當(dāng)客戶端向 API 發(fā)出請求時(shí),它通常需要向服務(wù)器發(fā)送數(shù)據(jù)(例如 JSON)。服務(wù)器將此數(shù)據(jù)反序列化為它可以處理的對象。當(dāng)服務(wù)器響應(yīng)時(shí),它會將對象序列化回客戶端可以理解的格式(例如,JSON、XML)。

序列化是將對象轉(zhuǎn)換為易于存儲或傳輸?shù)母袷降倪^程。這可能涉及將對象轉(zhuǎn)換為字節(jié)流、JSON 字符串、XML 文檔或其他格式。序列化可以將對象的狀態(tài)保存到文件中,通過網(wǎng)絡(luò)發(fā)送對象,或?qū)⑵浯鎯υ跀?shù)據(jù)庫中。
反序列化是相反的過程。它涉及將數(shù)據(jù)從存儲或傳輸?shù)母袷睫D(zhuǎn)換回對象。這允許使用其原始狀態(tài)和數(shù)據(jù)重建對象。
API 可以根據(jù)需求和客戶端的偏好返回各種類型的數(shù)據(jù)格式。以下是 API 可以返回的一些常見數(shù)據(jù)類型:

HTTP本身并不規(guī)定數(shù)據(jù)如何在格式上在客戶端和服務(wù)器之間傳遞;它與所使用的內(nèi)容類型和編碼無關(guān)。JSON 是一種被廣泛接受的現(xiàn)代 Web API 數(shù)據(jù)交換格式,因?yàn)樗哂泻唵涡浴⒖勺x性以及與 JavaScript 和許多其他編程語言的易用性。
以下是 HTTP 請求和響應(yīng)中通常如何處理 JSON 數(shù)據(jù):
在 .NET 中,在中間件中配置序列化涉及設(shè)置適當(dāng)?shù)男蛄谢绦蚝透袷交绦騺硖幚砀鞣N數(shù)據(jù)格式。以下是在 .NET 6 中執(zhí)行此操作的方法。
System.Text.Json是 .NET Core 和 .NET 6 中的默認(rèn) JSON 序列化程序。它以其性能和低內(nèi)存使用率而聞名。
Newtonsoft.Json(也稱為 Json.NET)是用于 .NET 的常用 JSON 框架。它具有高度的通用性,并因其廣泛的功能而被廣泛使用。我們需要添加 nuget 包 Microsoft.AspNetCore.Mvc.NewtonsoftJson,并在 .net 中間件中配置它,如下所示
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers()
.AddNewtonsoftJson();
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();
對于 XML 序列化,您需要將 XML 格式化程序添加到 API 配置中。我們需要 dotnet 添加 nuget 包和配置 Microsoft.AspNetCore.Mvc.Formatters.Xml
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllers()
.AddXmlSerializerFormatters(); // Add XML support
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();
協(xié)議緩沖區(qū)用于高效的數(shù)據(jù)序列化,適用于性能關(guān)鍵型應(yīng)用程序。我們需要添加包 Google.Protobuf 和 Grpc.AspNetCore 以及處理請求和響應(yīng)的控制器,并將其配置為支持 JSON 和 XML 序列化。
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddGrpc();
builder.Services.AddControllers();
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthorization();
在 .NET 6 中,可以將中間件配置為支持多種序列化格式,例如 XML 和 JSON。讓我們看看下面的代碼,以同時(shí)使用 XML 序列化和 Newtonsoft.Json 序列化。
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers()
.AddNewtonsoftJson() // Add Newtonsoft.Json support
.AddXmlSerializerFormatters(); // Add XML support
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();
[ApiController]
[Route("api/[controller]")]
public class OrderController : ControllerBase
{
[HttpPost]
[Produces("application/json", "application/xml")]
public IActionResult CreateOrder()
{
var contentType = Request.ContentType;
if (contentType.Contains("application/json"))
{
using var reader = new StreamReader(Request.Body);
var jsonString = reader.ReadToEnd();
var order = JsonConvert.DeserializeObject<Order>(jsonString);
if (order == null)
{
return BadRequest();
}
return Ok(order); // Return the created order in JSON
}
else if (contentType.Contains("application/xml"))
{
var serializer = new XmlSerializer(typeof(Order));
using var reader = new StreamReader(Request.Body);
var order = (Order)serializer.Deserialize(reader);
if (order == null)
{
return BadRequest();
}
return Ok(order); // Return the created order in XML
}
else
{
return UnsupportedMediaType();
}
}
}
在 .NET 中間件中配置序列化涉及選擇適當(dāng)?shù)男蛄谢绦虿⒃O(shè)置必要的格式化程序。通過理解和利用 System.Text.Json、Newtonsoft.Json、XML 格式化程序和協(xié)議緩沖區(qū)等庫,您可以確保您的 API 有效地處理各種數(shù)據(jù)格式,滿足不同的客戶端需求并優(yōu)化性能。這些配置和庫使開發(fā)人員能夠創(chuàng)建多功能且強(qiáng)大的 API,這些 API 可以有效地序列化和反序列化數(shù)據(jù),從而增強(qiáng)互操作性和性能。
本文章轉(zhuǎn)載微信公眾號@dotNET跨平臺