Sérialisation MessagePack
Lagoon utilise MessagePack pour réduire la taille des données échangées entre le client Blazor WebAssembly et le serveur ASP.NET Core, tout en gardant un usage transparent pour le développeur.
Câblage réel du framework
| Côté | Câblage vérifié |
|---|---|
| Serveur | LgApplication ajoute un LagoonMessagePackOutputFormatter aux OutputFormatters MVC. |
| Format | Le type MIME MessagePack est application/x-msgpack. |
| Options | Le framework utilise TypelessContractlessStandardResolver avec compression Lz4BlockArray, autorise les différences de version d'assembly et omet la version d'assembly. |
| Client | Les extensions HTTP Lagoon désérialisent application/x-msgpack avec les mêmes options. |
| Accept par défaut | ApplicationBehavior.DefaultAcceptHeader vaut DefaultAcceptHeader.MessagePack. |
Le formatter serveur ne sérialise pas les erreurs BadRequest en MessagePack : les erreurs restent sérialisées en JSON.
Usage transparent
Dans les appels HTTP Lagoon, le client demande MessagePack par défaut et désérialise automatiquement la réponse si le serveur renvoie application/x-msgpack.
public class OrdersApiService
{
private readonly HttpClient _http;
public OrdersApiService(HttpClient http)
{
_http = http;
}
public Task<List<VmOrder>> GetOrdersAsync(CancellationToken cancellationToken)
{
// L'extension Lagoon gère la désérialisation JSON ou MessagePack selon la réponse.
return _http.TryGetAsync<List<VmOrder>>("api/orders", cancellationToken);
}
}
Optimiser un ViewModel
Pour des listes volumineuses ou des ViewModels avec beaucoup de propriétés, vous pouvez décorer le ViewModel avec [MessagePackObject] et chaque propriété avec [Key(n)]. Cela évite de répéter les noms des propriétés dans le flux sérialisé.
using MessagePack;
namespace Demo.Shared.Orders;
[MessagePackObject]
public class VmOrder
{
[Key(0)]
public int Id { get; set; }
[Key(1)]
public string Reference { get; set; }
[Key(2)]
public bool Active { get; set; } = true;
[Key(3)]
public List<VmOrderLine> Lines { get; set; }
}
Les index Key doivent être uniques dans la classe. L'ordre technique n'a pas d'importance, mais conserver l'ordre des propriétés facilite la maintenance.
Revenir au JSON pour le debug
Le comportement client expose DefaultAcceptHeader. Pour simplifier l'inspection réseau dans le navigateur, une application peut demander JSON au lieu de MessagePack.
protected override void OnConfigureBehavior(ApplicationBehavior behavior)
{
base.OnConfigureBehavior(behavior);
// Demande des réponses JSON pour faciliter le debug réseau côté navigateur.
behavior.DefaultAcceptHeader = DefaultAcceptHeader.Json;
}
Points d'attention
- MessagePack est le format d'échange par défaut dans Lagoon.
- Les actions serveur n'ont pas besoin de choisir explicitement MessagePack : le formatter MVC s'en charge selon l'en-tête
Accept. - Les extensions HTTP Lagoon savent lire JSON et MessagePack.
- Pour les exports gérés par
[Queryable], le framework évite de réencoder le contenu binaire en JSON ou MessagePack lorsque la réponse doit être un fichier.