Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Kullanıcı Visual Studio'da etki alanına özgü bir dilin (DSL) örneğini veya modelini kaydettiğinde, bir XML dosyası oluşturulur veya güncelleştirilir. Dosya, modeli Mağaza'da yeniden oluşturmak için yeniden yüklenebilir.
DSL Gezgini'nde Xml Serileştirme Davranışı altındaki ayarları ayarlayarak serileştirme düzenini özelleştirebilirsiniz. Her etki alanı sınıfı, özelliği ve ilişkisi için Xml Serileştirme Davranışı altında bir düğüm vardır. İlişkiler kendi kaynak sınıflarının altında bulunur. Şekil, bağlayıcı ve diyagram sınıflarına karşılık gelen düğümler de vardır.
Daha gelişmiş özelleştirme için program kodu da yazabilirsiniz.
Not
Modeli belirli bir biçimde kaydetmek istiyorsanız ancak bu formdan yeniden yüklemeniz gerekmiyorsa, özel serileştirme düzeni yerine modelden çıkış oluşturmak için metin şablonlarını kullanmayı göz önünde bulundurun. Daha fazla bilgi için bkz . Etki Alanına Özgü Bir Dilden Kod Oluşturma.
Model ve Diyagram Dosyaları
Her model iki dosyaya kaydedilir:
Model dosyasının gibi
Model1.mydslbir adı vardır. Model öğelerini ve ilişkilerini ve özelliklerini depolar. gibi.mydsldosya uzantısı, DSL Tanımındaki Düzenleyici düğümünün FileExtension özelliği tarafından belirlenir.Diyagram dosyasının gibi
Model1.mydsl.diagrambir adı vardır. Şekilleri, bağlayıcıları ve bunların konumlarını, renklerini, çizgi kalınlıklarını ve diyagramın görünümünün diğer ayrıntılarını depolar. Kullanıcı bir.diagramdosyayı silerse modeldeki temel bilgiler kaybolmaz. Yalnızca diyagramın düzeni kaybolur. Model dosyası açıldığında, varsayılan bir şekil ve bağlayıcı kümesi oluşturulur.
DSL'nin dosya uzantısını değiştirmek için
DSL Tanımını açın. DSL Gezgini'nde Düzenleyici düğümüne tıklayın.
Özellikler penceresi FileExtension özelliğini düzenleyin. Dosya adı uzantısının ilk harfini
.eklemeyin.Çözüm Gezgini'da DslPackage\ProjectItemTemplates içindeki iki öğe şablonu dosyasının adını değiştirin. Bu dosyaların adları şu biçimdedir:
myDsl.diagrammyDsl.myDsl
Varsayılan Serileştirme Düzeni
Bu konuya örnek oluşturmak için aşağıdaki DSL Tanımı kullanılmıştır.

Bu DSL, ekranda aşağıdaki görünüme sahip bir model oluşturmak için kullanılır.

Bu model kaydedildi ve XML metin düzenleyicisinde yeniden açıldı:
<?xml version="1.0" encoding="utf-8"?>
<familyTreeModel xmlns:dm0="http://schemas.microsoft.com/VisualStudio/2008/DslTools/Core" dslVersion="1.0.0.0" Id="f817b728-e920-458e-bb99-98edc469d78f" xmlns="http://schemas.microsoft.com/dsltools/FamilyTree">
<people>
<person name="Henry VIII" birthYear="1491" deathYear="1547" age="519">
<children>
<personMoniker name="/f817b728-e920-458e-bb99-98edc469d78f/Elizabeth I" />
<personMoniker name="/f817b728-e920-458e-bb99-98edc469d78f/Mary" />
</children>
</person>
<person name="Elizabeth I" birthYear="1533" deathYear="1603" age="477" />
<person name="Mary" birthYear="1515" deathYear="1558" age="495" />
</people>
</familyTreeModel>
Seri hale getirilmiş model hakkında aşağıdaki noktalara dikkat edin:
Her XML düğümü, ilk harfin küçük olması dışında, etki alanı sınıf adıyla aynı bir ada sahiptir. Örneğin,
familyTreeModelveperson.Name ve BirthYear gibi etki alanı özellikleri XML düğümlerinde öznitelik olarak serileştirilir. Yine özellik adının ilk karakteri küçük harfe dönüştürülür.
Her ilişki, ilişkinin kaynak ucunun içinde iç içe yerleştirilmiş bir XML düğümü olarak serileştirilir. Düğüm, kaynak rol özelliğiyle aynı ada sahiptir, ancak daha küçük bir ilk karaktere sahiptir.
Örneğin, DSL Tanımı'nda People adlı bir rol FamilyTree sınıfından alınır. XML'de Kişiler rolü, düğümün içinde
familyTreeModeliç içe adlıpeoplebir düğümle temsil edilir.Her ekleme ilişkisinin hedef ucu, ilişkinin altında iç içe yerleştirilmiş bir düğüm olarak serileştirilir. Örneğin,
peopledüğüm birkaçpersondüğüm içerir.Her başvuru ilişkisinin hedef ucu, hedef öğeye bir başvuru kodlayan bir ad olarak serileştirilir.
Örneğin, bir
persondüğümün altında birchildrenilişki olabilir. Bu düğüm aşağıdaki gibi takma adlar içerir:<personMoniker name="/f817b728-e920-458e-bb99-98edc469d78f/Elizabeth I" />
Bilinenleri anlama
Takma adlar, modelin farklı bölümleri ve diyagram dosyaları arasındaki çapraz başvuruları temsil etmek için kullanılır. Bunlar, model dosyasındaki .diagram düğümlere başvurmak için dosyasında da kullanılır. İki ad biçimi vardır:
Kimlik takma adı , hedef öğenin GUID değerini alıntılar. Örneğin:
<personShapeMoniker Id="f79734c0-3da1-4d72-9514-848fa9e75157" />Nitelenmiş anahtar takma adları , hedef öğeyi, bilinen anahtar olarak adlandırılan belirlenmiş bir etki alanı özelliğinin değerine göre tanımlar. Hedef öğenin takma adı, ilişkileri ekleme ağacında üst öğesinin takma adıyla ön eklenmiştir.
Aşağıdaki örnekler, Song adlı bir etki alanı sınıfıyla ekleme ilişkisi olan Album adlı bir etki alanı sınıfının bulunduğu DSL'den alınmıştır:
<albumMoniker title="/My Favorites/Jazz after Teatime" /> <songMoniker title="/My Favorites/Jazz after Teatime/Hot tea" />Hedef sınıfın, Xml Serileştirme Davranışı'nda Ad Anahtarıdır seçeneğinin ayarlandığı
truebir etki alanı özelliği varsa, nitelenmiş anahtar takma adlar kullanılır. Örnekte, bu seçenek "Album" ve "Song" etki alanı sınıflarındaki "Title" adlı etki alanı özellikleri için ayarlanmıştır.
Nitelenmiş anahtar takma adlarının okunmasını kimlik takma adlarından daha kolaydır. Model dosyalarınızın XML'sinin insan tarafından okunabilir olmasını istiyorsanız, nitelikli anahtar takma adlarını kullanmayı göz önünde bulundurun. Ancak, kullanıcının aynı takma anahtara sahip olmak için birden fazla öğe ayarlaması mümkündür. Yinelenen anahtarlar dosyanın doğru şekilde yeniden yüklenememesine neden olabilir. Bu nedenle, nitelenmiş anahtar takma adlarını kullanarak başvuruda bulunılan bir etki alanı sınıfı tanımlarsanız, kullanıcının yinelenen takma adlara sahip bir dosyayı kaydetmesini engellemenin yollarını göz önünde bulundurmanız gerekir.
Kimlik takma adlarının başvuracağı bir etki alanı sınıfı ayarlamak için
Is Moniker Key
falsedeğerinin sınıfındaki ve temel sınıflarındaki her etki alanı özelliği için olduğundan emin olun.DSL Gezgini'nde Xml Serileştirme Davranışı\Sınıf Verileri\<etki alanı sınıfı>\Öğe Verileri'ni genişletin.
Is Moniker Key değerinin her etki alanı özelliği için olduğunu
falsedoğrulayın.Etki alanı sınıfının temel sınıfı varsa, bu sınıfta yordamı yineleyin.
Etki alanı sınıfı için Serileştirme Kimliği'ni
true= ayarlayın.Bu özellik Xml Serileştirme Davranışı altında bulunabilir.
Nitelikli anahtar takma adlarının başvuracağı bir etki alanı sınıfı ayarlamak için
Var olan bir etki alanı sınıfının etki alanı özelliği için Is Moniker Key değerini ayarlayın. Özelliğin türü olmalıdır
string.DSL Gezgini'nde Xml Serileştirme Davranışı\Sınıf Verileri\<etki alanı sınıfı>\Öğe Verileri'ni genişletin ve ardından etki alanı özelliğini seçin.
Özellikler penceresi, Is Moniker Key değerini olarak
trueayarlayın.
- veya -
Adlandırılmış Etki Alanı Sınıfı aracını kullanarak yeni bir etki alanı sınıfı oluşturun.
Bu araç, Ad adlı bir etki alanı özelliğine sahip yeni bir sınıf oluşturur. Bu etki alanı özelliğinin Is Öğesi Adı ve Is Bilinen Anahtar özellikleri olarak
truebaşlatılır.- veya -
Etki alanı sınıfından, bilinen anahtar özelliğine sahip başka bir sınıfa devralma ilişkisi oluşturun.
Yinelenen Takma Adlardan Kaçının
Nitelenmiş anahtar takma adlarını kullanırsanız, kullanıcının modelindeki iki öğe anahtar özelliğinde aynı değere sahip olabilir. Örneğin, DSL'nizde Name özelliğine sahip bir Person sınıfı varsa, kullanıcı iki öğe adlarını aynı olacak şekilde ayarlayabilir. Model dosyaya kaydedilebilse de doğru şekilde yeniden yüklenmez.
Bu durumdan kaçınmaya yardımcı olan çeşitli yöntemler vardır:
Anahtar etki alanı özelliği için Öğe Adı =
trueolarak ayarlayın. DSL Tanımı diyagramında etki alanı özelliğini seçin ve ardından Özellikler penceresi değerini ayarlayın.Kullanıcı sınıfın yeni bir örneğini oluşturduğunda, bu değer etki alanı özelliğinin otomatik olarak farklı bir değer atanmış olmasına neden olur. Varsayılan davranış, sınıf adının sonuna bir sayı ekler. Bu, kullanıcının adı yineleme olarak değiştirmesini engellemez, ancak modeli kaydetmeden önce kullanıcının değeri ayarlamaması durumunda yardımcı olur.
DSL için doğrulamayı etkinleştirin. DSL Gezgini'nde Düzenleyici\Doğrulama'yı seçin ve Uses... özelliklerini olarak
trueayarlayın.Belirsizlikleri denetleen otomatik olarak oluşturulmuş bir doğrulama yöntemi vardır. yöntemi doğrulama kategorisindedir
Load. Bu, kullanıcının dosyayı yeniden açmanın mümkün olmayabileceği konusunda uyarılacağından emin olur.Daha fazla bilgi için bkz . Etki Alanına Özgü Dilde Doğrulama.
Bilinen Yollar ve Niteleyiciler
Nitelenmiş anahtar takma adı, takma ad anahtarıyla biter ve ekleme ağacında üst öğesinin takma adıyla ön eklenir. Örneğin, bir Albümün adı şöyleyse:
<albumMoniker title="/My Favorites/Jazz after Teatime" />
O zaman bu Albümdeki Şarkılardan biri şöyle olabilir:
<songMoniker title="/My Favorites/Jazz after Teatime/Hot tea" />
Ancak albümlere bunun yerine kimlikle başvurulursa, takma adlar aşağıdaki gibi olur:
<albumMoniker Id="77472c3a-9bf9-4085-976a-d97a4745237c" />
<songMoniker title="/77472c3a-9bf9-4085-976a-d97a4745237c/Hot tea" />
GUID benzersiz olduğundan, hiçbir zaman üst öğesinin takma adıyla ön eklenmediğini fark edin.
Belirli bir etki alanı özelliğinin model içinde her zaman benzersiz bir değere sahip olacağını biliyorsanız, bu özellik için Ad Niteleyicisi true olarak ayarlayabilirsiniz. Bu, üst adı kullanılmadan niteleyici olarak kullanılmasına neden olur. Örneğin, Album sınıfının Title etki alanı özelliği için Hem Ad Niteleyicisi hem de Bilinen Anahtardır'ı ayarlarsanız, modelin adı veya tanımlayıcısı Albüm ve ekli alt öğelerinin adlarında kullanılmaz:
<albumMoniker name="Jazz after Teatime" />
<songMoniker title="/Jazz after Teatime/Hot tea" />
XML'nin yapısını özelleştirme
Aşağıdaki özelleştirmeleri yapmak için DSL Gezgini'nde Xml Serileştirme Davranışı düğümünü genişletin. Bir etki alanı sınıfı altında, bu sınıftan alınan özelliklerin ve ilişkilerin listesini görmek için Öğe Verileri düğümünü genişletin. bir ilişki seçin ve Özellikler penceresi seçeneklerini ayarlayın.
Kaynak rol düğümünü atlar ve yalnızca hedef öğe listesini bırakarak Atla Öğesini true olarak ayarlayın. Kaynak ve hedef sınıflar arasında birden fazla ilişki varsa bu seçeneği ayarlamamalısınız.
<familyTreeModel ...> <!-- The following node is omitted by using Omit Element: --> <!-- <people> --> <person name="Henry VIII" .../> <person name="Elizabeth I" .../> <!-- </people> --> </familyTreeModel>Hedef düğümleri ilişki örneklerini temsil eden düğümlere eklemek için Tam Form Kullan'ı ayarlayın. Bir etki alanı ilişkisine etki alanı özellikleri eklediğinizde bu seçenek otomatik olarak ayarlanır.
<familyTreeModel ...> <people> <!-- The following node is inserted by using Use Full Form: --> <familyTreeModelHasPeople myRelationshipProperty="x1"> <person name="Henry VIII" .../> </familyTreeModelHasPeople> <familyTreeModelHasPeople myRelationshipProperty="x2"> <person name="Elizabeth I" .../> </familyTreeModelHasPeople> </people> </familyTreeModel>Temsil = Öğesi'ni, bir etki alanı özelliğinin öznitelik değeri yerine bir öğe olarak kaydedilmesini sağlamak için ayarlayın.
<person name="Elizabeth I" birthYear="1533"> <deathYear>1603</deathYear> </person>Özniteliklerin ve ilişkilerin seri hale getirilme sırasını değiştirmek için, Öğe Verileri altında bir öğeye sağ tıklayın ve Yukarı Taşı veya Aşağı Taşı menü komutlarını kullanın.
Program kodunu kullanarak büyük özelleştirme
Serileştirme algoritmalarının parçalarını veya tümünü değiştirebilirsiniz.
Dsl\Generated Code\Serializer.cs ve SerializationHelper.cs kodu incelemenizi öneririz.
Belirli bir sınıfın serileştirmesini özelleştirmek için
Xml Serileştirme Davranışı altında bu sınıfın düğümünde Özel olarak ayarlayın.
Tüm Şablonları Dönüştürün, çözümü derleyin ve sonuçta elde edilen derleme hatalarını araştırın. Her hataya yakın açıklamalar, hangi kodu sağlamanız gerekenleri açıklar.
Modelin tamamı için kendi serileştirmenizi sağlamak için
- Dsl\GeneratedCode\SerializationHelper.cs'da geçersiz kılma yöntemleri
Not
Visual Studio 2022 17.13'den başlayarak, varsayılan serileştirme uygulaması artık BinaryFormatter ile ilgili güvenlik risklerinden dolayı BinaryFormatter kullanarak özel veri türlerini serileştirmeyi veya seri durumdan kaldırmayı desteklemez.
Herhangi bir etki alanı özelliği için özel bir veri türü kullanıyorsanız, sınıftaki serileştirme yöntemlerini SerializationHelper geçersiz kılmanız veya her özel veri türünü bir dizeye ve dizeden dönüştürebilen bir TypeConverter uygulamanız gerekir.
Güvenlik nedeniyle kullanılmasını BinaryFormatter önermesek de, serileştirme kullanan BinaryFormatter eski modellerle geriye dönük uyumluluğu sürdürmeniz gerekiyorsa, ikili verileri seri durumdan çıkaran bir TypeConverter uygulayabilirsiniz. Aşağıdaki kod parçacığı, bu uyumluluğu uygulamak için bir şablon görevi görür:
class MyCustomDataTypeConverter : TypeConverter
{
public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
{
return sourceType == typeof(string) || base.CanConvertFrom(context, sourceType);
}
public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
{
return destinationType == typeof(string) || base.CanConvertTo(context, destinationType);
}
public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
{
if (value is string text)
{
// First, try to parse the string as if it were returned by MyCustomDataType.ToString().
if (MyCustomDataType.TryParse(text, out var custom))
return custom;
// Fall back to trying to deserialize the old BinaryFormatter serialization format.
var decoded = Convert.FromBase64String(text);
using (var memory = new MemoryStream(decoded, false))
{
var binaryFormatter = new BinaryFormatter();
return binaryFormatter.Deserialize(memory) as MyCustomDataType;
}
}
return base.ConvertFrom(context, culture, value);
}
public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
{
if (destinationType == typeof(string) && value is MyCustomDataType custom)
return custom.ToString();
return base.ConvertTo(context, culture, value, destinationType);
}
}
// ...
[TypeConverter(MyCustomDataTypeConverter)]
class MyCustomDataType
{
// ...
}
Xml Serileştirme Davranışındaki Seçenekler
DSL Gezgini'nde Xml Serileştirme Davranışı düğümü, her etki alanı sınıfı, ilişki, şekil, bağlayıcı ve diyagram sınıfı için bir alt düğüm içerir. Bu düğümlerin her birinin altında, bu öğede kaynak olarak alınan özelliklerin ve ilişkilerin listesi yer alır. İlişkiler hem kendi haklarında hem de kaynak sınıflarının altında temsil edilir.
Aşağıdaki tabloda DSL Tanımının bu bölümünde ayarlayabileceğiniz seçenekler özetlenmiştir. Her durumda DSL Gezgini'nde bir öğe seçin ve Özellikler penceresi seçenekleri ayarlayın.
Xml Sınıfı verileri
Bu öğeler DSL Gezgini'nde Xml Serileştirme Davranışı\Sınıf Verileri altında bulunur.
| Özellik | Açıklama |
|---|---|
| Özel Öğe Şeması Var | True ise, etki alanı sınıfının özel bir öğe şeması olduğunu gösterir |
| Özeldir | Bu etki alanı sınıfı için kendi serileştirme ve seri durumdan çıkarma kodunuzu yazmak istiyorsanız değeri True olarak ayarlayın. Ayrıntılı yönergeleri bulmak için çözümü derleyin ve hataları araştırın. |
| Etki Alanı Sınıfı | Bu sınıf veri düğümünü uygulayan etki alanı sınıfı. Salt okunur. |
| Öğe Adı | Bu sınıfın öğeleri için xml düğümü adı. Varsayılan değer, etki alanı sınıf adının küçük bir sürümüdür. |
| Takma Ad Öznitelik Adı | Başvuruyu içermek için bilinen öğelerde kullanılan özniteliğin adı. Boşsa, anahtar özelliğinin veya kimliğinin adı kullanılır. Bu örnekte"ad": <personMoniker name="/Mike Nash"/> |
| Bilinen Öğe Adı | Bu sınıfın öğelerine başvuran adlar için kullanılan xml öğesinin adı. Varsayılan değer, sınıf adının "Moniker" ile ekli küçük harfli bir sürümüdür. Örneğin, personMoniker. |
| Ad Türü Adı | Bu sınıfın öğelerine yönelik takma adlar için oluşturulan xsd türünün adı. XSD Dsl\Generated Code\*Schema.xsd konumundadır |
| Seri Hale Getirme Kimliği | True ise, guid öğesi dosyaya eklenir. Is Moniker Key olarak işaretlenmiş bir özellik yoksa ve DSL bu sınıfa başvuru ilişkilerini tanımlıyorsa değer True olarak ayarlanmalıdır. |
| Tür Adı | Belirlenen etki alanı sınıfından xsd içinde oluşturulan xml türünün adı. |
| Notlar | Bu öğeyle ilişkili resmi olmayan notlar |
Xml Özellik Verileri
Xml Özellik düğümleri sınıf düğümlerinin altında bulunur.
| Özellik | Açıklama |
|---|---|
| Etki Alanı Özelliği | Xml serileştirme yapılandırma verilerinin uygulandığı özellik. Salt okunur. |
| Is Moniker Key | Değer True olarak ayarlanırsa, özelliği bu etki alanı sınıfının örneklerine başvuran adlar oluşturmak için anahtar olarak kullanılır. |
| Ad Niteleyicisi | Değer True olarak ayarlanırsa, özelliği niteleyiciyi adlarda oluşturmak için kullanılır. False ise ve SerializeId bu etki alanı sınıfı için doğru değilse, takma adlar ekleme ağacındaki üst öğenin takma adı tarafından nitelenir. |
| Temsil | Değer Öznitelik olarak ayarlanırsa, özellik bir xml özniteliği olarak serileştirilir; değer Öğe olarak ayarlandıysa, öğe olarak serileştirilir; değer Yoksay olarak ayarlanırsa serileştirilmemiştir. |
| Xml Adı | Özelliği temsil eden xml özniteliği veya öğesi için kullanılan ad. Varsayılan olarak, değer etki alanı özellik adının küçük bir sürümüdür. |
| Notlar | Bu öğeyle ilişkili resmi olmayan notlar |
Xml Rolü verileri
Rol veri düğümleri, kaynak sınıf düğümlerinin altında bulunur.
| Özellik | Açıklama |
|---|---|
| Özel Takma Adı Var | Bu ilişkiden geçen takma adları oluşturmak ve çözümlemek için kendi kodunuzu sağlamak istiyorsanız bunu true olarak ayarlayın. Ayrıntılı yönergeler için çözümü derleyin ve ardından hata iletilerine çift tıklayın. |
| Etki Alanı İlişkisi | Bu seçeneklerin uygulanacağı ilişkiyi belirtir. Salt okunur. |
| Atla Öğesi | True ise, kaynak role karşılık gelen XML düğümü şemadan atlanır. Kaynak ve hedef sınıflar arasında birden fazla ilişki varsa, bu rol düğümü iki ilişkiye ait olan bağlantıları birbirinden ayırır. Bu nedenle bu durumda bu seçeneği ayarlamamanızı öneririz. |
| Rol Öğesi Adı | Kaynak rolden türetilen XML öğesinin adını belirtir. Varsayılan değer rol özelliği adıdır. |
| Tam Form Kullan | True ise, her hedef öğe veya takma ad, ilişkiyi temsil eden bir XML düğümü içine alınır. İlişkinin kendi etki alanı özellikleri varsa, bu true olarak ayarlanmalıdır. |