Tasarımcı seri hale getirme genel bakış
Tasarımcı seri hale getirme ile tasarım zamanında bileşenlerinizin durumunu kalıcı veya çalışma zamanı.
Nesneleri seri hale getirme
.NET Framework Seri hale getirme, kod oluşturma, soap Seri hale getirme, ikili seri hale getirme ve xml serialization gibi çeşitli türlerini destekler.
Tasarımcı seri hale getirme genellikle geliştirme araçları ile ilişkilendirilmiş nesne Kalıcılık türünü içeren bir seri hale getirme, özel bir formudur.Tasarımcı seri hale getirme nesne grafiği daha sonra nesne grafiği kurtarmak için kullanılabilecek bir kaynak dosyası dönüştürme işlemidir.Bir kaynak dosyasý kod, biçimlendirme veya hatta sql tablosu bilgilerini içerebilir.Tasarımcı seri hale getirme, tüm ortak dil çalışma zamanı nesneler için çalışır.
Tasarımcı seri hale getirme tipik bir nesne seri hale getirme çeşitli şekillerde farklıdır:
Nesne seri hale getirme işlemi çalıştırma nesneden ayrı, böylece bileşen tasarım zamanı mantığı kaldırılabilir.
Seri hale getirme şeması, nesne tam olarak başlatılmış durumda oluşturulur ve özelliği üzerinden değiştirilebilir ve yöntem çağırmaları sırasında deserialization varsayımı altında uygulandıkça.
Hiçbir zaman nesne üzerinde ayarlanmış değerleri olan bir nesnenin özelliklerini sıralanmış değil.Tam tersine, akışın serisini kaldırma tüm özellik değerlerini başlatmak değil.Seri hale getirme kuralları daha ayrıntılı bir açıklaması için bu konunun ilerisinde "Genel seri hale getirme kuralları" bölümüne bakın.
Bir nesnenin tam seri hale getirme yerine seri hale getirme akışı içinde içerik kalitesi vurgu yerleştirilir.Tanımlanan bir nesne seri hale getirilmeye yolu ise, o nesnenin bir özel durum oluşturur yerine geçirilecek.Tasarımcı seri hale getirme, basit, kullanıcı tarafından okunabilen bir biçimde yerine opak bir blob olarak bir nesne seri hale getirmek için vardır.
Seri hale getirme akışın serisini kaldırma için gerekenden daha fazla veri olabilir.Örneğin, kaynak kod seri hale getirme nesne grafiği seriyi kaldırmak için gereken kodu ile karışık kullanıcı kodu vardır.Bu kullanıcı kodu üzerinde seri hale getirme korunur ve seri kaldırma üzerinde geçirilen gerekir.
[!NOT]
Tasarımcı seri hale getirme, tasarım zamanında yanı sıra, çalıştırma sırasında kullanılabilir.
İle yerine getirdi tasarım hedefleri aşağıdaki tabloda gösterilmektedir .NET Framework Tasarımcı seri hale getirme altyapı.
En önemli tasarım |
Description |
---|---|
Modüler |
Seri hale getirme işlemi yeni veri türleri kapsayacak şekilde genişletilmiş ve kendilerini yararlı, kullanıcı tarafından okunabilen açıklamaları bu veri türleri sağlayabilir. |
Kolayca genişletilebilir |
Dizileştirme işlemi, yeni veri türleri kolayca kapsayacak şekilde genişletilebilir. |
Biçim Tarafsız |
Nesneleri birçok farklı dosya biçimlerinde katılabilir ve tasarımcı seri hale getirme, belirli veri biçimine kurulamayacak. |
Mimari
Tasarımcı seri hale getirme mimarisi, meta veri, serializers ve bir seri hale getirme yöneticisinin dayanır.Aşağıdaki tabloda, her yönü mimarisinin rolünün açıklar.
Boy |
Description |
---|---|
Meta veri öznitelikleri |
Bir öznitelik türü t bazı getiricisi s. ile ilişkilendirmek için kullanılırAyrıca, olmayan türleri için serializers sağlayan nesne yüklemek için kullanılan bir "önyükleme" özniteliği mimarisini destekler. |
Serializers |
Bir seri hale getirici, belirli bir tip veya bir dizi türü seri hale bir nesnedir.Her veri biçimi için temel sınıf vardır.Örneğin, olabileceği gibi bir DemoXmlSerializer bir nesneyi XML'e dönüştürebilir sınıf temel.Herhangi bir özel seri hale getirme biçimi mimarisi bağımsızdır ve kod belge nesne modeli (CodeDOM) üzerinde yerleşik bu mimari uygulaması da içerir. |
Seri hale getirme yöneticisinin |
Seri hale getirme yöneticisinin bir nesne grafiği seri hale getirmek için kullanılan tüm çeşitli serializers için bir bilgi deposu sağlayan bir nesnedir.Grafik 50 nesnelerin tüm kendi çıktı üretmesini 50 farklı serializers sahip olabilir.Seri hale getirme yöneticisinin bu serializers göre birbirleriyle iletişim kurmak için kullanılır. |
Aşağıdaki resimde ve yordamı nasıl bu durumda a ve b grafik nesneleri seri hale getirilebilir göstermek.
Grafik nesneleri seri hale getirilmedi.
Arayan bir seri hale getirici bir nesne seri hale getirme Yöneticisi'nden ister:
MySerializer s = manager.GetSerializer(a);
A'ın meta verileri özniteliği type a bir seri hale getirici istenen türde için bağlar.Arayan a: seri hale getiricisi sonra sorar.
Blob b = s.Serialize(manager, a);
a. A'ın nesne seri hale getirici serileştirildiğinia getirilirken bulduğu her nesne için ek serializers seri hale getirme yöneticisinin istekleri:
MySerializer s2 = manager.GetSerializer(b); Blob b2 = s2.Serialize(manager, b);
Seri hale getirme sonucu çaðýrana döndürülür:
Blob b = ...
Genel seri hale getirme kuralları
Bir bileşeni genellikle bir dizi özellikleri sunar.Örneğin, Windows Forms Button denetimi gibi özellikleri olan BackColor, ForeColor, ve BackgroundImage.Yerleştirdiğinizde bir Button bir tasarımcı, bir form üzerindeki denetime ve oluşturulan kodu görüntülemek, yalnızca bir alt kümesini özelliklerini kodda kalıcı bulacaksınız.Tipik olarak, kendisi için açıkça bir değer ayarladığınız özellikler bunlar.
CodeDomSerializer İle ilgili Button denetimi seri hale getirme davranışını tanımlar.Tarafından kullanılan kuralların bazıları aşağıdaki listede açıklanmaktadır CodeDomSerializer bir özelliğin değerini seri hale getirmek için:
Özelliği varsa, bir DesignerSerializationVisibilityAttribute kendisine bağlı, seri hale getirici bu özellik sıralanmış belirlemek için kullanır (gibi Visible veya Hidden) ve seri hale getirmek (Content).
Visible Veya Hidden değerleri belirtin özelliği seri.Content Değer özelliği nasıl sıralanmış belirtir.
Bir özellik adı verilen DemoProperty, bileşen adı verilen bir metot, ShouldSerializeDemoProperty, tasarımcı ortamı seri hale getirmek karar vermek için bu yöntemi Geç Baðlanmýþ çağrısı yapar.Örneğin, BackColor özelliği, yöntemi çağırıldığında ShouldSerializeBackColor.
Özelliği varsa, bir DefaultValueAttribute belirtilen bileşen geçerli değeri varsayılan değeri karşılaştırılır.Yalnızca geçerli değeri varsayılan olmayan ise özelliği seri hale getirilmiş.
Bileşenle ilişkili Tasarımcısı tarafından seri hale getirme kararı, bir bölümü de çalıp gölgeleme özellikler veya uygulama ShouldSerialize yöntemleri kendisi.
[!NOT]
Seri hale getirme kararı seri hale getirici defers PropertyDescriptor özelliği ile ilişkili ve PropertyDescriptor daha önce listelenen kuralları kullanır.
Farklı bir şekilde bileşeninizin seri hale getirmek istiyorsanız, türetildiği kendi seri hale getirici sınıfı yaz CodeDomSerializer ve sizin bileşenini kullanma ile ilişkilendirmek DesignerSerializerAttribute.
Akıllı seri hale getirici uygulaması
Seri hale getirici tasarım gereksinimlerini yeni bir seri hale getirme biçimi gerektiğinde, tüm veri türleri bu biçimde desteklemek için meta verileri özniteliği ile güncelleştirilmelidir biridir.Ancak, genel nesne meta verilerini kullanan serializers ile gevşekçe seri hale getirme sağlayıcıları kullanılmasıyla bu gereksinimin karşılanabileceği.Bu bölümde, böylece birçok özel serializers gereksinimini simge durumuna küçültülmüş bir seri hale getirici belirli bir biçimde tasarlamak için tercih edilen yolu açıklanmaktadır.
Aşağıdaki şema, bir nesne grafiği korunur varsayımsal bir xml biçimi tanımlar.
<TypeName>
<PropertyName>
ValueString
</PropertyName>
</TypeName>
Bu biçim adında bir invented sınıfını kullanarak seri DemoXmlSerializer.
public abstract class DemoXmlSerializer
{
public abstract string Serialize(
IDesignerSerializationManager m,
object graph);
}
Olduğunu unutmamalısınız DemoXmlSerializer bir dizeden bir parça yukarı oluşturur modüler bir sınıf.Örneğin, DemoXmlSerializer için Int32 veri türü dize "bir tamsayı değeri 23 geçirildiğinde 23" dönmek.
Seri hale getirme sağlayıcıları
Önceki şema örneği temizleyin, işlenmesi için iki temel türü vardır kolaylaştırır:
Alt özelliklerine sahip nesneler.
Nesneleri, metne dönüştürülür.
Her sınıf, o sınıfın metin veya xml etiketleri dönüştürebilirsiniz bir özel seri hale getirici ile donatıldığından zorlaşacaktır.Seri hale getirme sağlayıcıları bu nesneyi belirli bir türü için bir seri hale getirici sağlamak için fırsat verildiği bir geri dönüş mekanizması sağlayarak çözün.Bu örnekte, aşağıdaki koşullar tarafından kullanılabilir türleri kümesi sınırlıdır.
Türü bir dize kullanarak dönüştürülebilir, IConvertible arabirimi, StringXmlSerializer kullanılacak.
Bir dize türü dönüştürülemiyorsa, ancak genel olarak ve boş bir yapıcı olan ObjectXmlSerializer kullanılacak.
Bunlar doğruysa, seri hale getirme sağlayıcı döndürür null, hiçbir nesne seri hale getirici olduğunu gösterir.
Aşağıdaki kod örneği, bu hata ile neler arama seri hale getirici çözümler nasıl gerçekleştirildiğini gösterir.
internal class XmlSerializationProvider : IDesignerSerializationProvider
{
object GetSerializer(
IDesignerSerializationManager manager,
object currentSerializer,
Type objectType,
Type serializerType)
{
// Null values will be given a null type by this serializer.
// This test handles this case.
if (objectType == null)
{
return StringXmlSerializer.Instance;
}
if (typeof(IConvertible).IsSubclassOf(objectType))
{
return StringXmlSerializer.Instance;
}
if (objectType.GetConstructor(new object[]) != null)
{
return ObjectXmlSerializer.Instance;
}
return null;
}
}
Seri hale getirme sağlayıcı tanımlandıktan sonra onu kullanmak konması gerekir.Seri hale getirme yöneticisinin bir seri hale getirme sağlayıcısı aracılığıyla verilebilir AddSerializationProvider yöntemi, ancak bu seri hale getirme yöneticisinin bu çağrının yapılması gerekir.Seri hale getirme sağlayıcısı otomatik olarak bir seri hale getirme yöneticisinin ekleyerek eklenebilir bir DefaultSerializationProviderAttribute seri hale getirici için.Bu öznitelik seri hale getirme sağlayıcı ortak, boş bir yapıcı olmasını gerektirir.Aşağıdaki kod örneği için gerekli değişikliği gösterir DemoXmlSerializer.
[DefaultSerializationProvider(typeof(XmlSerializationProvider))]
public abstract class DemoXmlSerializer
{
}
Şimdi, her bir seri hale getirme yöneticisinin sorulan herhangi bir tür için DemoXmlSerializer, onu zaten değil gerçekleşmişse seri hale getirme yöneticisinin varsayılan seri hale getirme sağlayıcısı eklenecektir.
Serializers
Örnek DemoXmlSerializer adlı iki somut seri hale getiricisi sınıf sınıfı vardır StringXmlSerializer ve ObjectXmlSerializer.Aşağıdaki kod örneği uygulaması gösterir StringXmlSerializer.
internal class StringXmlSerializer : DemoXmlSerializer
{
internal StringXmlSerializer Instance = new StringXmlSerializer();
public override string Serialize(
IDesignerSerializationManager m,
object graph)
{
if (graph == null) return string.Empty;
IConvertible c = graph as IConvertible;
if (c == null)
{
// Rather than throwing exceptions, add a list of errors
// to the serialization manager.
m.ReportError("Object is not IConvertible");
return null;
}
return c.ToString(CultureInfo.InvariantCulture);
}
}
ObjectXmlSerializer Uygulama nesnesinin genel özelliklerini numaralandırmak gerekli olduğundan daha kapsamlı.Aşağıdaki kod örneği uygulaması gösterir ObjectXmlSerializer.
internal class ObjectXmlSerializer : DemoXmlSerializer
{
internal ObjectXmlSerializer Instance = new ObjectXmlSerializer();
public override string Serialize(
IDesignerSerializationManager m,
object graph)
{
StringBuilder xml = new StringBuilder();
xml.Append("<");
xml.Append(graph.GetType().FullName);
xml.Append(">");
// Now, walk all the properties of the object.
PropertyDescriptorCollection properties;
Property p;
properties = TypeDescriptor.GetProperties(graph);
foreach(p in properties)
{
if (!p.ShouldSerializeValue(graph))
{
continue;
}
object value = p.GetValue(graph);
Type valueType = null;
if (value != null) valueType = value.GetType();
// Get the serializer for this property
DemoXmlSerializer s = m.GetSerializer(
valueType,
typeof(DemoXmlSerializer)) as DemoXmlSerializer;
if (s == null)
{
// Because there is no serializer,
// this property must be passed over.
// Tell the serialization manager
// of the error.
m.ReportError(string.Format(
"Property {0} does not support XML serialization",
p.Name));
continue;
}
// You have a valid property to write.
xml.Append("<");
xml.Append(p.Name);
xml.Append(">");
xml.Append(s.Serialize(m, value);
xml.Append("</");
xml.Append(p.Name);
xml.Append(">");
}
xml.Append("</");
xml.Append(graph.GetType().FullName);
xml.Append(">");
return xml.ToString();
}
}
ObjectXmlSerializerHer özellik değeri için diğer serializers çağırır.Bunun iki avantajı vardır.İlk olarak, verir ObjectXmlSerializer çok basit olması.İkinci, üçüncü taraf türleri için genişletilebilirlik noktası sağlar.ObjectXmlSerializer Bu serializers birini özel bir seri hale getirici türü için sağlanan yazılamayan türüne sahip sunulan.
Kullanım
Bu yeni serializers örneği kullanmak için IDesignerSerializationManager oluşturulmalıdır.Bu örnekten bir seri hale getirici isteyin ve sonra nesneleri seri hale getirici isteyin.Aşağıdaki kod örneği için Rectangle bir nesne için bu tür boş bir yapıcı ve destekleyen dört özellikleri vardır çünkü, seri hale için kullanılan IConvertible.Uygulama yerine IDesignerSerializationManager tarafından sağlanan uygulama kullanmak, DesignerSerializationManager.
Rectangle r = new Rectangle(5, 10, 15, 20);
DesignerSerializationManager m = new DesignerSerializationManager();
DemoXmlSerializer x = (DemoXmlSerializer)m.GetSerializer(
r.GetType(), typeof(DemoXmlSerializer);
string xml = x.Serialize(m, r);
Bu, aşağıdaki xml oluşturacak.
<System.Drawing.Rectangle>
<X>
5
</X>
<Y>
10
</Y>
<Width>
15
</Width>
<Height>
15
</Height>
</System.Drawing.Rectangle>
[!NOT]
xml girintili değildir.Bu kolayca üzerinden gerçekleştirilmesi Context özelliği IDesignerSerializationManager.Seri hale getirici her düzeyde geçerli girinti düzeyini içeren İçerik yığını bir nesne ekleyebilirsiniz ve her seri hale getirici ve o nesnenin yığın aramak bir girinti sağlamak için kullanın.
Ayrıca bkz.
Başvuru
DefaultSerializationProviderAttribute