[英]C# Castle ActiveRecord: How to elegantly (XML) serialize ActiveRecord objects?
我很难找到有关如何优雅地序列化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可序列化的非AR版本。 考虑到我们目前有18个不同的AR对象被序列化的事实,这就是我们解决方案中的36个其他文件! 一切(一切)都告诉我这是一个糟糕的解决方案,但我一直找不到更好的方法。
我们还尝试使用了Soap Formatter,但是由于ActiveRecrodLinqBase <>未被“标记为可序列化”,所以这也是一个死胡同。
急切地获取您需要的所有内容,然后使用AutoMapper将其映射到DTO并序列化这些DTO。
您收到的代理错误表明,当DTO应该使用普通List<T>
或数组代替时,它们实际上正在使用NHibernate的代理集合。 确保使用ToList()
或类似的东西。
另外,您不需要使用接口来映射DTO。
尝试使用DataContractSerializer。
与[XmlInclude]等效的是[KnownType],它包含一个可以动态提供类型以包含首次反映该类型的版本。 请参阅http://msdn.microsoft.com/en-us/library/ms730167.aspx
另外,我认为(尽管不是100%地确定).NET4.0将在DataContractSerializer中包含“类型映射器”功能,这专门使这种情况变得更容易。
如果您最终尝试使用DCS并遇到问题,请对此答案发表评论,我会尽力回答。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.