Мне трудно найти информацию о том, как элегантно сериализовать объекты ActiveRecord.
Мы хотели бы использовать XML в качестве формата, поскольку нам нужно выводить наши объекты таким образом, чтобы другая программа могла их реально проанализировать.
XML-сериализация обычно очень проста и проста в реализации, но проблема возникает при попытке сериализации объекта, возвращенного из базы данных ActiveRecord. База данных возвращает прокси-класс объекта, тип которого нельзя предвидеть явно с помощью атрибута [XmlInclude]
.
Например:
public class Foo : ActiveRecordLinqBase<Foo>
{
public virtual string Bar{get;set;}
public virtual int FooId{get;set;}
public Foo(string bar)
{
Bar = bar;
}
public static void FooSerializeExample()
{
Foo tehFoozor = new Foo("omgFoo!");
tehFoozor.SaveAndFlush();
int id = tehFoozor.FooId;
//...
//Assume new ActiveRecord session.
XmlSerializer serializer = new XmlSerializer(typeof(Foo));
Foo tehFoozorToSerialize = Foo.Find(id);
using(Stream stream = File.OpenWrite("tehFoozor.xml"))
{
serializer.Serialize(stream, tehFoozorToSerialize); //Will fail
}
}
}
При сериализации здесь мы получим сообщение:
«Тип FooProxy2e2de24df9be42909d13a67fdb00b981 не ожидался. Используйте атрибут XmlInclude или SoapInclude, чтобы указать типы, которые статически неизвестны.»
где тип Proxy будет совершенно непредсказуемым (по крайней мере, насколько мне известно).
В качестве временного решения моя команда поместила свойства каждого объекта AR в интерфейсы. Затем мы реализовали объекты «Контейнер» для каждого из них, которые по сути являются версиями объектов, не относящимися к AR, в формате XML. Учитывая тот факт, что в настоящее время у нас есть 18 различных объектов AR, которые сериализуются, это 36 дополнительных файлов в нашем решении! Что-то (все) говорит мне, что это плохое решение, но я не смог найти лучшего пути.
Мы также пытались использовать средство форматирования мыла, но поскольку ActiveRecrodLinqBase <> не «помечен как сериализуемый», это также был тупик.