2017-09-05 2 views
15

Ich war nur neugierig, warum C# -Arrays true für ihre IsSerializable Eigenschaft zurückgeben. Arrays haben kein Serializable Attribut, und sie implementieren auch nicht die ISerializable Schnittstelle, also warum ist die IsSerializable Eigenschaft auf true festgelegt?Warum C# -Array-Typ IsSerializable-Eigenschaft ist True?

Wenn ich den Code unten versuchen, gibt es "True" in der Konsole:

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

Die Ausgabe lautet:

True 

Try it online

Meine .NET-Runtime-Version ist 3.5.

+0

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

+1

@EdPlunkett Ich sah durch die Dokumentation, die Sie verbunden sind, aber ich kann finde nichts, was auf die Frage anwendbar scheint. –

+1

@dahui Es gibt keine nützlichen Informationen. [Dieser Link ist korrekt] (https://msdn.microsoft.com/en-us/library/system.array.aspx) –

Antwort

21

Arrays nicht hat jede Serializable Attribut und auch sie sind nicht implementieren ISerializable Schnittstelle

Array Klasse, eine implizite Basisklasse # Arrays C, hat [SerializableAttribute]:

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

(reference)

Es auch app Ohren, die der Compiler [SerializableAttribute] an das Array selbst fügt Typ

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

Passing false zu GetCustomAttributes sichergestellt, dass nur für diese Klasse Attribute und für seine Basisklassen nicht, werden zurückgegeben.

Demo.

+0

Warum trägt die Basisklasse von diesem, 'System.Object', auch das' [Serializable] 'Attribut? In welcher Version der Laufzeit benutzen Sie 'typeof (string []). GetCustomAttributes (false)' gibt dieses Attribut zurück? Eine letzte Frage: Ist es in Ihrer Antwort implizit, dass es eine Beziehung gibt zwischen dem, was 'IsSerializable' für ein' System.Type'-Objekt zurückgibt, und ob die Klasse, die es darstellt, das '[Serializable]' - Attribut trägt oder nicht? –

+0

Ich habe versucht, einige meiner eigenen Bemerkungen zu untersuchen. Es scheint, dass "IsSerializable" angibt, ob es in den meisten Fällen ein Attribut "[Serializable]" gibt, aber einige Aufzählungstypen und Delegattypen sind Ausnahmen. Für mich scheinen Array-Typen, wie 'string []', ebenfalls Ausnahmen zu sein? Das Attribut wird nicht vererbt (wenn es so wäre, würden alle Klassen es erben, da es, wie gesagt, "System.Object" schmückt). –

+0

@JeppeStigNielsen Danke für einen tollen Kommentar! Ich habe das ebenfalls untersucht, und es sieht so aus, als ob die Implementierung tief in den Herzen der CLR steckt. Der Code in der Demo läuft unter ideone, daher bin ich mir nicht sicher, welche Laufzeitversion sie verwenden. Wenn ich das auf der neuesten Laufzeit von Microsoft ausführte, bekam ich keine Attribute zurück, selbst wenn ich "True" an "GetCustomAttributes" übergab.An dieser Stelle denke ich, dass das Markieren von serialisierbaren Klassen eine CLR-Magie ist, die in der nativen Implementierung der Methode "RuntimeTypeHandle.GetAttributes" versteckt ist. Ich kann die Quelle dafür jedoch nicht finden. – dasblinkenlight

Verwandte Themen