我很难找到有关如何优雅序列化ActiveRecord对象的信息。C#Castle ActiveRecord:如何优雅地(XML)序列化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-Serializable非AR版本。考虑到我们目前有18个不同的AR对象序列化,这是我们解决方案中的36个附加文件!某些东西(所有东西)告诉我这是一个糟糕的解决方案,但是我一直无法找到更好的方法。我们也尝试过使用Soap Formatter,但由于ActiveRecrodLinqBase <>没有被标记为可序列化,所以这也是一个死路一条。
经过更多搜索,我发现这是发生的原因是因为我们使用“延迟加载”。这不是我们可以妥协的事情,因为我们要加载的对象将具有深层次结构,有时包含数千个要通过Microsoft MVC加载和显示的部分。 其中一位高级开发人员排队等待反思,将其作为可能的解决方案。有没有其他人通过这个? – Anj 2009-10-08 17:56:17