Мне сложно найти информацию о том, как элегантно сериализовать объекты 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, чтобы указать типы, которые не известны статически».
где тип прокси будет совершенно непредсказуемым (по крайней мере, насколько мне известно).
В качестве временного решения моя команда вставила свойства каждого объекта AR в интерфейсы. Затем мы реализовали объекты «Контейнер» для каждого, которые по сути являются Xml-сериализуемыми версиями объектов без дополненной реальности. Учитывая тот факт, что в настоящее время у нас есть 18 различных объектов AR, которые сериализованы, это 36 дополнительных файлов в нашем решении! Что-то (все) подсказывает мне, что это плохое решение, но я не смог найти лучшего способа.
Мы также пробовали использовать Soap Formatter, но поскольку ActiveRecrodLinqBase ‹> не« помечен как сериализуемый », это тоже было тупиком.