GOOGLE ADS

mardi 19 avril 2022

Code C# first grpc : convertisseur protobuf personnalisé pour DateTime

J'utilise quelque chose comme ça dans dotnet asp net core 6:

<PackageReference Include="protobuf-net.Grpc.AspNetCore" Version="1.0.152" />
<PackageReference Include="protobuf-net.Grpc.AspNetCore.Reflection" Version="1.0.152" />
[DataContract]
public class TaskItem
{
//other properties omitted
[DataMember(Order = 5)]
public DateTime DueDate { get; set; } = null!;
}

Maintenant, quand j'appelle le service avec grpcurl

"DueDate": {
"value": "458398",
"scale": "HOURS"
}

Et dans le fichier proto généré

import "protobuf-net/bcl.proto"; // schema for protobuf-net's handling of core.NET types
message TaskItem {
//other properties omitted
.bcl.DateTime DueDate = 5;

Existe-t-il un moyen de spécifier un convertisseur personnalisé afin qu'il sérialise en chaîne ISO 8601 afin de mieux prendre en charge plusieurs plates-formes (j'aurai des clients en js où avoir une chaîne est acceptable puisque j'ai juste besoin new Date(v)de and d.toISOString())?

Je sais que je peux simplement déclarer DueDate en tant que chaîne, mais le "problème" est que lorsque j'utilise le client C# code-first, je dois également reconvertir en DateTime et en chaîne...

Par exemple, je peux faire ce qui suit avec JSON

.AddJsonOptions(x =>
{
x.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter());
});


Solution du problème

Ce que vous demandez est très différent d'un convertisseur de type JSON. Comme l'expliquent les docs, la méthode standard de sérialisation des dates est le google.protobuf.Timestamptype. C'est défini dans le protodossier. Lorsque vous utilisez code-first, ce fichier est généré par l'outil open source protobuf-net.Grpc.

Pour utiliser le Timestamptype, vous devez dire à l'outil de formater cette propriété en utilisant un type bien connu avec l' ProtoMemberattribut:

[ProtoMember(1, DataFormat = DataFormat.WellKnown)]
public DateTime Time { get; set; }

Ceci est illustré dans le document de démarrage de l'outil.

Ce n'est pas la valeur par défaut pour des raisons héritées :

(pour des raisons d'héritage, protobuf-net utilise par défaut une mise en page spécifique à la bibliothèque différente qui est antérieure à l'introduction de.google.protobuf.Timestamp). Il est recommandé d'utiliser DataFormat.WellKnown sur les valeurs DateTime et TimeSpan dans la mesure du possible.

Aucun commentaire:

Enregistrer un commentaire

Comment utiliseriez-vous .reduce() sur des arguments au lieu d'un tableau ou d'un objet spécifique&nbsp;?

Je veux définir une fonction.flatten qui aplatit plusieurs éléments en un seul tableau. Je sais que ce qui suit n'est pas possible, mais...