繁体   English   中英

C#Castle ActiveRecord:如何优雅地(XML)序列化ActiveRecord对象?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM