DSL добавляет корневой элемент в сериализацию

StackOverflow https://stackoverflow.com/questions/1271166

  •  13-09-2019
  •  | 
  •  

Вопрос

Я ищу помощь для достижения следующего

Диаграмма представляет собой автомобиль, пользователи могут добавлять двигатель и цвет.

когда я просматриваю XML, он выглядит так:

<Car>
  <Engine>BigEngine</Engine>
  <Colour>Pink</Colour>
</Car>

Я хотел бы обернуть машину внутри «транспортного средства», т.е.

<Vehicle>
  <Car>
    <Engine>BigEngine</Engine>
    <Colour>Pink</Colour>
  </Car>
</Vehicle>

Я не уверен, что это лучший способ добиться этого.Я хочу, чтобы обозреватель модели и сгенерированный XML были обернуты в «транспортное средство», но для всех остальных целей пользователь работает только с автомобилем.

Информация:Visual Studio 2010, C# и DSL SDK для 2010 года.

Это было полезно?

Решение 2

Я исправил это следующим образом.Я дважды получаю класс Car и в сериализаторе Car делаю это:

Написание дополнительных элементов:

  public partial class CarSerializer : CarSerializerBase
{
    public override void Write(SerializationContext serializationContext, ModelElement element, XmlWriter writer, RootElementSettings rootElementSettings)
    {
        // Adds the Model and LobSystem root elements to match that required by the SharePoint BCS
        writer.WriteStartElement("Garage");
        writer.WriteStartElement("Cars");
        base.Write(serializationContext, element, writer, rootElementSettings);
        writer.WriteEndElement();
        writer.WriteEndElement();
    }
}

Чтобы иметь возможность прочитать это обратно, я переопределяю метод Car LoadModel в SerializationHelper, и там, где он получает средство чтения, я читаю элементы, пока не доберусь до Car.

....

XmlReader reader = XmlReader.Create(fileStream, settings);
reader.MoveToContent();
while (!reader.EOF && !reader.Name.Equals("Car"))
{
   reader.Read();
}

reader = reader.ReadSubtree();

//    using (global::System.Xml.XmlReader reader = global::System.Xml.XmlReader.Create(fileStream, settings))
using (reader)
{

....

Другие советы

Я бы попробовал два разных подхода:


1-й: переопределить класс пакета DSL Docdata в файле docdata.cs и метод переопределения

protected override void OnDocumentSaved(System.EventArgs e)

а затем я бы создал обертку

после этого я бы переопределил DocData.cs

protected override void OnDocumentLoading(System.EventArgs e)

и перед вызовом базового метода base.OnDocumentLoading(e); я бы удалил из файла.


2-й: В DSL Explorer перейдите в раздел «Поведение сериализации XML» и установите для класса автомобильного домена «Is Custom = true».

Это решение не простое, но и не такое сложное, как кажется на первый взгляд.Вам необходимо определить каждый отдельный метод, но для каждого пользовательского метода вы можете вызвать сгенерированный DSL метод под названием «DefaulMethod», который имеет поведение сериализатора DSL по умолчанию.


В настоящее время я использую VS 2005, поэтому некоторые вещи могли измениться...

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top