2017-09-05 3 views
15

J'étais juste curieux de savoir pourquoi les tableaux C# retournent true pour leur propriété IsSerializable. Les tableaux n'ont aucun attribut Serializable, et ils n'implémentent pas non plus l'interface ISerializable, alors pourquoi la propriété IsSerializable est-elle définie sur true?Pourquoi la propriété IsSerializable de type C# Arrays est True?

Lorsque je tente le code ci-dessous, il délivre en sortie "True" dans la console:

Console.WriteLine (new string[0].GetType().IsSerializable); 

La sortie est:

True 

Try it online

My .NET version d'exécution est 3,5.

+0

https://docs.microsoft.com/en-us/dotnet/api/system.serializableattribute?view=netframework-4.7 – dahui

+1

@EdPlunkett je regardé à travers la documentation que vous avez lié, mais je peux Ne trouvez rien qui semble applicable à la question. –

+1

@dahui Il n'y a aucune information utile. [Ce lien est correct] (https://msdn.microsoft.com/fr-fr/library/system.array.aspx) –

Répondre

21

Arrays n'a pas de Serializable attribut et mettre en œuvre ils ne sont pas ISerializable l'interface

Array classe, une classe de base implicite de tableaux C#, a [SerializableAttribute]:

[SerializableAttribute] 
[ComVisibleAttribute(true)] 
public abstract class Array : ICloneable, IList, ICollection, 
    IEnumerable, IStructuralComparable, IStructuralEquatable 

(reference)

Il app également oreilles que le compilateur ajoute [SerializableAttribute] au type tableau lui-même

foreach (var a in typeof(string[]).GetCustomAttributes(false)) { 
    Console.WriteLine(a); // Prints "System.SerializableAttribute" 
} 

Passant false-GetCustomAttributes garantit que seuls les attributs de cette classe, et non pour ses classes de base, sont retournés.

Demo.

+0

Pourquoi, la classe de base de ce 'System.Object', porte également l'attribut' [Serializable] '? Quelle version de l'exécution utilisez-vous pour 'typeof (string []). GetCustomAttributes (false)' renvoie cet attribut? Une dernière question: Est-ce implicite dans votre réponse qu'il existe une relation entre ce que 'IsSerializable' renvoie pour un objet' System.Type', et si la classe qu'il représente porte ou non l'attribut '[Serializable]'? –

+0

J'ai essayé d'enquêter sur certaines de mes propres remarques. Il semble que 'IsSerializable' reflète s'il existe un attribut' [Serializable] 'dans la plupart des cas, mais certains types enum et delegate sont des exceptions. Pour moi, il semble que les types de tableaux, comme 'string []', sont aussi des exceptions? L'attribut n'est pas hérité (si c'était le cas, toutes les classes l'hériteraient car il décore 'System.Object', comme je l'ai dit). –

+0

@JeppeStigNielsen Merci pour votre commentaire! J'ai aussi enquêté là-dessus, et il semble que la mise en œuvre soit profonde dans les tripes du CLR. Le code de la démo fonctionne sur ideone, donc je ne suis pas sûr de la version de l'exécution qu'ils utilisent. Lorsque j'ai exécuté ceci sur le dernier runtime de Microsoft, je n'ai récupéré aucun attribut, même en passant 'true' à' GetCustomAttributes'.À ce stade, je pense que le marquage des classes sérialisables est une magie CLR, cachée dans l'implémentation native de la méthode 'RuntimeTypeHandle.GetAttributes'. Je ne peux pas trouver la source pour cela, cependant. – dasblinkenlight