是否可以在 WCF 中没有无参数构造函数的情况下序列化对象?
Posted
技术标签:
【中文标题】是否可以在 WCF 中没有无参数构造函数的情况下序列化对象?【英文标题】:Is it possible to serialize objects without a parameterless constructor in WCF? 【发布时间】:2010-10-10 22:29:35 【问题描述】:我知道私有无参数构造函数可以工作,但是没有无参数构造函数的对象呢?
我想从第三方库中公开类型,因此我无法控制类型定义。
如果有办法,最简单的方法是什么?例如。我不需要创建子类型。
编辑:
我正在寻找类似于此处显示的自定义级别:http://msdn.microsoft.com/en-us/magazine/cc163902.aspx 虽然我不想求助于流来序列化/反序列化。
【问题讨论】:
【参考方案1】:您不能真正使任意类型可序列化;在某些情况下(例如XmlSerializer
),运行时会公开用于欺骗属性的选项。但是DataContractSerializer
不允许这样做。可行的选择:
基本上,如果某些东西不是设计用于序列化的,那么框架的很少部分让你序列化它。
【讨论】:
很遗憾,我想要类似扩展方法的东西,框架在对象上查找扩展方法,如果存在,它会调用它来序列化/反序列化。 框架无法真正寻找扩展方法;它们是一个编译器技巧。如果存在多个,它会选择哪个?您所描述的内容接近替代品,但这仍然需要大量工作。 是的,我猜你必须以某种方式注册你的实现。如果只有一个简单而强大的序列化钩子(即不需要拥有被序列化的类型),那么 WCF 中就有这么多钩子。【参考方案2】:我刚刚运行了一个小测试,使用 WCF 服务返回一个没有默认构造函数的基本对象。
//[DataContract]
//[Serializable]
public class MyObject
public MyObject(string _name)
Name = _name;
//[DataMember]
public string Name get; set;
//[DataMember]
public string Address get; set;
这是服务的样子:
public class MyService : IMyService
#region IMyService Members
public MyObject GetByName(string _name)
return new MyObject(_name) Address = "Test Address" ;
#endregion
只要 MyObject 是 [DataContract] 或 [Serializable],这实际上是有效的。有趣的是,它似乎不需要客户端的默认构造函数。这里有一个相关的帖子:
How does WCF deserialization instantiate objects without calling a constructor?
【讨论】:
不幸的是,第 3 方框架类型既没有标记为 [DataContract] 也没有标记为 [Serializable]。 这意味着它们不是为序列化而设计的,所以不要序列化它们。 您也许可以编写一个可序列化的适配器对象,该对象包装了第 3 方类型,并且只对您需要的部分进行序列化。【参考方案3】:我不是 WCF 专家,但它们不太可能支持对具有任意类型的构造函数进行序列化。即因为他们会传递什么值?您可以为引用类型传递 null,为结构传递空值。但是可以用完全空的数据构造一个类型有什么好处呢?
我认为您只能选择 2 个选项中的 1 个
-
对有问题的类型进行子类化并将适当的默认值传递给非无参数构造函数
创建一个只存在于序列化的类型。完成后,它可以创建您感兴趣的原始类型的实例。它是各种各样的桥梁。
我个人会选择#2。使类成为仅数据结构,并针对序列化和工厂目的对其进行优化。
【讨论】:
这个问题是库中有很多类型,我必须映射所有类型,这就是我现在正在做的第三个类型的子集党图书馆。以上是关于是否可以在 WCF 中没有无参数构造函数的情况下序列化对象?的主要内容,如果未能解决你的问题,请参考以下文章