Est-ce que la conception d'interfaces marqueur comme Serializable ou Cloneable Java évolué en C #?
-
26-10-2019 - |
Question
Java fournit java.io.Serializable
et java.lang.Cloneable
dans sa bibliothèque standard (et un soutien particulier pour elle dans la langue et la machine virtuelle Java) pour les tâches autour désérialisation / sérialisation / clonage.
A C # choisi un chemin différent pour fournir cette fonctionnalité, comment la mise en œuvre et le code à l'aide de Java il différent et pourquoi at-il été fait de cette façon?
À titre d'exemple, pourquoi C # utilise à la fois un attribut (annotation) et une interface pour la sérialisation?
La solution
.NET n'utilise pas ISerializable
comme une simple interface de marqueur. Il agit non seulement comme un marqueur, mais vous permet également de contrôler exactement comment .NET sérialisera la classe en mettant en œuvre GetObjectData
et un constructeur qui prend les arguments appropriés.
L'attribut est utilisé lorsque la classe peut être sérialisée, mais vous ne voulez pas définir votre propre comportement de sérialisation.
: Utilisez ISerializable
lorsque vous souhaitez définir votre propre comportement de sérialisation; ou utiliser l'attribut [Serializable]
lorsque vous voulez laisser à la formatter sérialisation.
ce que je l'appelle évolution? Je ne sais pas. .NET est juste vous offre différents degrés de flexibilité.
Autres conseils
si vous voulez quelque chose sérialisation: cochez cette
Je ne pense pas que C # a évolué. Au contraire, ils ont fixé les deux choses:
-
sérialisation en Java est pas très propre: désérialisation implique l'objet « création » sans faire appel à un constructeur, le processus peut inclure l'exécution d'appeler des méthodes privées, etc. consultez les spécifications si vous êtes curieux.
-
Cloneable
est tout simplement cassé. Il ne doit pas être une interface de marqueur, mais préciser la méthode declone()
. Comme il est vousCloneable
s vous ne pouvez pasclone()
.
En fait, il y a beaucoup de choses en Java, principalement de la pré 1,2 jours, qui sont tout à fait cassé / foiré / / impur tout.
Je ne sais pas ce que vous entendez par « évolué », si tout ce que je pense que la tendance est vers des attributs plutôt que des interfaces marqueurs. Je ne sais pas si Java est allé de cette façon ces derniers temps aussi bien.
sérialisation dans le CLR par exemple est mise en évidence dans sa forme de base avec des attributs, mais vous pouvez mettre en œuvre quelques interfaces non-marqueurs qui vous donnent plus de contrôle sur le processus si vous en avez besoin.
interfaces marqueurs sont probablement l'une des pires décisions jamais mises en œuvre en Java. Je veux dire il suffit de regarder comment Cloneable inutile avéré être, parce que personne ne définit une méthode clone public () dans l'interface.
.NET ne va pas dans cette direction (au moins je ne suis pas au courant des interfaces dans cette direction) est moins d'une évolution et plus d'un abandon de la notion. Une autre direction qui semble prendre de plus en plus semble être annotations, que je suppose que vous pouvez voir comme un « marqueur », mais à un niveau plus basique (par exemple, je suis sûr que Java a été mis en œuvre transitoire aujourd'hui serait une annotation et pas un qualificatif)