2011-03-03 29 views
0

我正在开发一个项目,我想通过Web服务从数据库中发送一个实体。如何序列化生成的类?

我把这作为我的数据合同。

[DataContract] 
public class CreateAlumniRequest 
{ 
    [DataMember] 
    public List<Alum.Data.EmploymentHistory> lstEmploymentHistory; 
} 

但是,我不断收到此错误。

类型 'Alum.Data.Base.EmploymentHistoryBase' 无法序列。请考虑使用DataContractAttribute 属性标记 ,并使用 DataMemberAttribute属性标记要与其序列化的所有成员 成员。如果 类型是一个集合,请考虑将其与 CollectionDataDataContractAttribute标记为 。

这告诉我我可能需要去EmploymentHistory类并将其标记为DataContract。

问题是EmploymentHistory是由一个内部ORM工具生成的 - 我无法真正对其进行任何更改。

是否有可能在不添加该属性的情况下序列化EmploymentHistory?

有没有其他解决方案?我能想到的唯一办法是在可序列化的类中重新创建EmploymentHistory并手动映射对象,这听起来像很多重复。

回答

1

我不确定你试图使用哪个序列化器,但是如果Alum.Data.EmploymentHistory不能被序列化,因为它没有被标记为可序列化或者其他原因......应该能够恰到好处点击它并提取界面。使用重构菜单创建一个类来实现接口,并在成员上实现{get; set;}。然后,您可以使用automapper来映射数据。

它听起来很像,但它实际上会很快......并且会避免所有的手动映射。即使你不使用automapper,它绝对值得一看。有很多情况下需要将数据从一个对象复制到另一个对象......“AssertConfigurationIsValid”使测试映射变得容易。如果你的数组或列表或任何类型的嵌套对象的东西都是自动处理的...非常酷...检查出来。

+0

这可能是我必须要做的。我只是不喜欢这样一个事实,即如果EmploymentHistory发生变化,我将不得不记住重新映射变量。 – Diskdrive 2011-03-03 03:59:48

0

如果您的codegenerator创建了部分类,您可以将缺少的属性添加到新的部分文件中。

如果不是 ,您可以尝试使用不同的开源串行器,如SharpSerializerprotobuf-net

+0

您可以使用此方法添加接口实现,但不能将属性添加到已生成文件中已声明的属性。这就是为什么DataAnnotations为我们提供了buddy-class方法,我认为这不是WCF支持的方法。但是,仍然可以创建一个包含生成文件中定义的所有属性的接口,然后将其应用于部分类中。 – 2011-03-03 08:45:15

+0

对于可序列化类型,[DataContract]属性不是必需的,但WCF显然遇到了EmploymentHistory类的一部分或属性,它可能无法序列化。在这种情况下,某些属性将需要[DataMember]。 – 2011-03-03 08:51:50

+0

@J。提洪:tnx的信息。我更新了我的回答 – k3b 2011-03-03 09:03:23