Краткая версия: мне нужно иметь возможность сериализовать / десериализовать XML и поддерживать ссылки на основе пользовательских идентификаторов, которые я установил. Мне нужно что-то общее, и я могу сделать это, построив ссылки обратно после сериализации, или, желательно, настроить сериализатор C #, который справился бы с этим.
Я создаю приложение WCF, которое должно взаимодействовать с широким спектром приложений. По сути, мы создаем очень сложный калькулятор. У нас есть общая база данных, однако состояние объекта пользователя может отличаться от состояния в БД, и мы не хотим сохранять это промежуточное состояние.
Мне нужно иметь возможность передавать сложные связанные объекты в XML (см. WCF), которые используют настраиваемый построитель ссылок. Строителю необходимо собрать объекты вместе на основе идентификатора каждого объекта. Я хочу иметь возможность указать идентификатор, чтобы другое приложение (например, C ++) могло вызвать наше приложение, правильно построив XML.
Я знаю, что XmlSerializer будет копировать только всю ссылку, а DataContractSerializer сохранит целостность ссылки, но при этом создаст идентификатор на месте. Как разрешить эти ссылки во время сериализации или после сериализации?
Если ответ - «Вы не можете», я задаю следующий вопрос.
В настоящее время мы создали собственный сериализатор, но он работает МЕДЛЕННО (XmlSerializer в 8-30 раз быстрее в зависимости от размера файла). Наш настраиваемый сериализатор может обрабатывать следующий XML, но у него есть второй шаг, на котором он разрешает ссылки (после десериализации). Но мне придется серьезно переработать и настроить, чтобы XmlSerializer работал с этим, потому что нам нужна производительность XmlSerializer. (И.Е. Использование списка идентификаторов и разрешение этих ссылок с помощью XmlIgnore во всех наших ссылочных классах). Существуют ли какие-либо инструменты или библиотеки, которые уже делают это для XML на этапе разрешения или на этапе сериализации?
Изменить: когда я десериализирую это, мне нужно, чтобы эти ссылки сохранялись. Если я меняю имя учителя в классе, имя учителя должно быть изменено в школе.
Я собрал упрощенную версию того, о чем я говорю, и XML, который хотел бы использовать для ее анализа.
public class Teacher
{
//This is a made up annotation that represents what I'd like to happen.
[DataMember(IsReferenceId = True)]
public int Id { get; set; }
public string Name { get; set; }
//This is a made up annotation that represents what I'd like to happen.
[DataMember(IsReference = True)]
public List<Class> Classes { get; set; }
public Teacher()
{
Classes = new List<Class>();
}
public Teacher(int id)
{
Classes = new List<Class>();
Id = id;
}
}
public class Class
{
//This is a made up annotation that represents what I'd like to happen.
[DataMember(IsReferenceId = True)]
public int Id { get; set; }
public string Subject { get; set; }
//This is a made up annotation that represents what I'd like to happen.
[DataMember(IsReference = True)]
public Teacher Teacher { get; set; }
public Class()
{}
public Class(int id)
{
Id = id;
}
}
public class School
{
public string Name { get; set; }
public List<Class> Classes { get; set; }
public List<Teacher> Teachers { get; set; }
}
Я хочу иметь возможность анализировать XML таким образом.
<School>
<Classes>
<Class>
<Id>1</Id>
<Subject>Biology</Subject>
<Teacher><Id>1</Id></Teacher>
</Class>
<Class>
<Id>2</Id>
<Subject>Advanced Biology</Subject>
<Teacher><Id>1</Id></Teacher>
</Class>
<Class>
<Id>3</Id>
<Subject>Algebra</Subject>
<Teacher><Id>2</Id></Teacher>
</Class>
<Class>
<Id>4</Id>
<Subject>Trigonometry</Subject>
<Teacher><Id>2</Id></Teacher>
</Class>
</Classes>
<Teachers>
<Teacher>
<Id>1</Id>
<Name>Biology Teacher</Name>
<Classes>
<Class><Id>1</Id></Class>
<Class><Id>2</Id></Class>
</Classes>
</Teacher>
<Teacher>
<Id>2</Id>
<Name>Biology Teacher</Name>
<Classes>
<Class><Id>3</Id></Class>
<Class><Id>4</Id></Class>
</Classes>
</Teacher>
</Teachers>
</School>
Я не включил код, который десериализует или сериализует это, потому что реализация будет зависеть от того, какой сериализатор используется. Но в настоящее время я использую XmlSerializer с [XmlIgnore] вместо [DataContract (IsReference = True)]. Однако мне нужно будет вернуть эти ссылки.
Примечание. JSON - это не вариант, но мы можем использовать любую библиотеку с открытым исходным кодом, которая сериализует Xml.