2016-07-27 4 views
2

Dans le paquet JSON de Go, j'ai vu qu'il y a marshal, decode et d'autres fonctions.Relations et différences entre marshall/unmarshal, codage/décodage et sérialisation/désérialisation pour JSON?

Je pensais que decode est l'opposé de marshal, mais le dernier s'est rendu compte que je pourrais me tromper.

Je pense que la question fondamentale que j'ai est:

Quelles sont les relations et les différences entre marshall/unmarshal, l'encodage/décodage et sérialisation/désérialisation pour JSON?

Merci.

Voir un exemple ici Why are json package's Decode and Marshal methods used here?

+0

@ Tim, pourquoi vous n'avez pas encore choisi * la * réponse? Toujours insatisfait? – xpt

Répondre

2

Je dirais personnellement tous ces termes sont synonymes mais moins avec le codage/décodage. Dans Go Marshal et Unmarshal se trouvent être les termes qui sont utilisés pour décrire la conversion de json sous forme de chaîne à un objet et vice versa. Cependant, en C#, ces mêmes méthodes sont appelées serialize et deserialize, pour autant que je sache que la terminologie n'est pas du tout en Go (du moins dans les bibliothèques std lib).

L'encodage peut être utilisé comme un adjectif pour décrire le format dans lequel certaines données sont stockées, l'utilisation la plus courante est probablement le codage de caractères (UTF-8). Dans Go, il est également utilisé comme un nom pour décrire des objets qui peuvent démarsaliser/marshall json. Marshal/Unmarshal sont toujours utilisés comme verbes, vous prenez cette action sur le json.

L'encodage est également utilisé dans Go pour faire référence à une catégorie plus importante de packages qui traitent de la conversion d'un encodage à un autre. Si vous me disiez que vous étiez en train de rassembler, rassembler, désérialiser ou sérialiser un objet ou un json, je comprendrais exactement ce que vous vouliez dire. Si vous avez dit que vous étiez en train de coder un objet, je vous poserais une question de clarification. Si vous avez dit que la "réponse est codée en json", j'obtiendrais ce que vous voulez dire, bien que je pense qu'il est étrange que vous utilisiez ces mots plutôt que de simplement dire "la réponse est json". J'espère que c'est plus ou moins l'information que vous cherchez.

Oh aussi, juste pour plus de clarté

Unmarshal == deserialize == decode

Marshal == serialize == encode

+0

Merci. Voir un exemple ici http://stackoverflow.com/questions/38620151/why-are-json-packages-decode-and-marshal-methods-used-here – Tim

+0

@Tim Je vais jeter un coup d'oeil à cela quand je reçois un minute. – evanmcdonnal

2

Dans l'ensemble encoding/json, la fonction Marshal et le retour de la fonction inverse Unmarshal et fonctionnent sur octets fixes simples tranches. Ils transforment des objets uniques en octets, et vice versa. Il existe également les types Encoder et Decoder. Ceux-ci contiennent les méthodes Encode et Decode, et ils fonctionnent sur des flux d'octets, prenant respectivement io.Reader et io.Writer. Ils permettent également de plusieurs objets d'être sérialisés ou désérialisés avec un délimiteur de nouvelle ligne utilisant ces flux.

Les mécanismes sous-jacents des fonctions Marshal/Unmarshal et les types Encoder/Decoder sont identiques, ils utilisent tous deux les mêmes chemins de code internes encodeState.marshal et decodeState.unmarshal. La seule vraie différence est qu'ils fournissent un accès alternatif pour différents modèles d'utilisation.

+0

Merci. Voir un exemple ici http://stackoverflow.com/questions/38620151/why-are-json-packages-decode-and-marshal-methods-used-here – Tim