Еще одна проблема сохранения ссылки XmlSerializer - PullRequest
0 голосов
/ 13 сентября 2011

Я работаю над «новым языком» (не таким амбициозным) определением XML, я хочу иметь возможность работать с графом объектов через xml (сериализация / десериализация) и API.

public class Project
{
    public List<Connection> Connections  { get; set; }
    public List<Table> Tables { get; set; }

   /* Constructors and more.... */
}

public class Connection
{
    public string Name { get; set; }
    public string ConnectionString { get; set; }

    /* Constructors and more.... */
 }

public class Table
{
    public string TableName { get; set; }
    public Connection Conn { get; set; }
    /* Constructors and more.... */
}

ОК, теперь я хочу сериализовать / десериализовать что-то вроде:

<Project>
 <Connections>
   <Connection Name="MyConnName" ConnectionString="My connection string"\>
 <\Connections>
 <Tables>
   <Table TableName="MyTable" ConnectionName="MyConnName"\>
 <\Tables>
<\Project>

Здесь есть две проблемы:

  1. У класса есть свойство «Conn», которое является ссылкой на класс соединения, но в «language» (сериализация Xml) переименовано в «ConnectionName» (я хочу изменить имя, избегая путаницы между чистым Ссылка на объект (класс) и язык "ссылка по имени" (XML Seralization)

  2. Как видите, я хочу сохранить ссылку, но не включая "z.id ??" как DataContractSerializer, когда preserveObjectReference имеет значение true, вместо этого я хочу использовать «имена» (гораздо более удобочитаемые)

Есть идеи?

1 Ответ

0 голосов
/ 13 сентября 2011

На самом деле нет хорошего способа расширить XmlSerializer, чтобы делать то, что вы хотите, почти для любого полезного значения «что вы хотите».

Чтобы сгенерировать тот тип XML, который вы ищете, выВам нужно будет украсить свойство Connection с помощью [XmlIgnore], добавить свойство ConnectionName для использования в XmlSerializer и найти соответствующий Connection, когда установлен ConnectionName или когда-нибудь после.

В качестве альтернативы вам понадобится Table реализовать IXmlSerializable и полностью вручную код, который генерирует элемент <Table>.

...