2017-09-05 39 views
15

Yalnızca C# dizilerinin, numaralı ürününün neden IsSerializable özelliği için döndüğünü merak ettim. Diziler, Serializable özniteliğine sahip değildir ve ayrıca ISerializable arabirimini uygulamamaktadır, bu nedenle IsSerializable özelliği neden true olarak ayarlanmış? Aşağıdaki kod çalıştığınızdaNeden C# Dizileri IsSerializable özelliği doğrudur?

, bu konsolda "Doğru" çıkarır:

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

çıktısı:

True 

Try it online

Benim .NET çalışma zamanı sürümü 3.5.

+0

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

+1

@EdPlunkett sana bağlı belgelere baktım, ama ben can soruya uygun görünen herhangi bir şey bulamadınız. –

+1

@dahui Yararlı bilgi yoktur. [Bu bağlantı doğru] (https://msdn.microsoft.com/en-us/library/system.array.aspx) –

cevap

21

Arrays herhangi Serializable niteliği yoktur ve ayrıca ISerializable arayüzü

Array sınıf, C# diziler örtülü bir temel sınıf uygulamak değil [SerializableAttribute] sahiptir:

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

(reference)

Aynı zamanda uygulama derleyici diziye [SerializableAttribute] ekler kulaklar kendisini GetCustomAttributes için false sadece bu sınıf için niteliklerini ve bunun temel sınıfları için, döndürülür değil sağlar Geçme

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

yazın.

Demo.

+0

nedir OP'ye açıklayabileceğinden bununla bağlantı kuruyordum. Neden, 'System.Object' temel sınıfı '[Serializable]' özelliğini taşıyor? Çalışma zamanının hangi sürümünü 'typeof (string []). GetCustomAttributes (false) 'i kullanmak için kullanıyorsunuz? Son bir soru: Cevabınızda, 'System.Type' nesnesinin 'IsSerializable' iadesi ile temsil ettiği sinemanın' [Serializable] 'özniteliğini taşıdığı veya taşımaması arasında bir ilişki olduğu ima ediliyor mu? –

+0

Bazı sözlerimi araştırmaya çalıştım. "IsSerializable" ifadesinin, çoğu durumda bir "[Serializable]" özniteliği olup olmadığını yansıttığı, ancak bazı enum türlerinin ve temsilci türlerinin istisnalar olduğu anlaşılmaktadır. Benim için dizi dizisi gibi görünüyor, yani string [] 'de istisnalar var mı? Öznitelik miras alınmaz (eğer öyle olsaydı, dediğim gibi System.Object'i süslediğinden, tüm sınıflar onu devralır). –

+0

@JeppeStigNielsen Harika bir yorum için teşekkürler! Bunu da araştırdım ve uygulama CLR'nin bağırsaklarında derin gibi görünüyor. Demodaki kod ideone üzerinde çalışır, bu yüzden hangi çalışma süresinin kullanıldığından emin değilim. Bunu Microsoft'un en son çalışma zamanı üzerinde çalıştırdığımda, "true" ile "GetCustomAttributes" öğesini döndürürken bile hiçbir özniteliğim kalmadı.Bu noktada serileştirilebilir sınıfları işaretlemenin, "RuntimeTypeHandle.GetAttributes" yönteminin yerel uygulamasında gizli olan bir CLR sihri olduğunu düşünüyorum. Bununla birlikte, bunun kaynağını bulamıyorum. – dasblinkenlight