是否可以在WCF中没有无参数构造函数的情况下序列化对象?

时间:2009-03-03 03:15:24

标签: wcf .net-3.5 serialization c#-3.0

我知道私有无参数构造函数可以工作,但是没有无参数构造函数的对象呢?

我想公开来自第三方库的类型,因此我无法控制类型定义。

如果有什么方法最简单的?例如。我不需要创建子类型。

编辑:

我正在寻找的是类似于此处显示的自定义级别:http://msdn.microsoft.com/en-us/magazine/cc163902.aspx 虽然我不想使用流来序列化/反序列化。

3 个答案:

答案 0 :(得分:5)

你不能真正使任意类型可序列化;在某些情况下(例如XmlSerializer),运行时公开了欺骗属性的选项。但DataContractSerializer不允许这样做。可行的选择:

  • 隐藏自己类型背后的类 可序列化(大量工作)
  • 提供二进制格式化代理(yeuch)
  • 编写自己的序列化核心(很多工作要做对)

基本上,如果某些内容不是设计的用于序列化,那么很少有框架会对其进行序列化。

答案 1 :(得分:1)

我不是WCF专家,但它们不太可能支持具有任意类型的构造函数的序列化。也就是因为他们会传递什么价值?您可以为结构的引用类型和空值传递null。但是,如果用完全空的数据构建一个类型会有什么好处呢?

我认为你坚持使用2个选项之一

  1. 子类有问题的类型,并将适当的默认值传递给非无参数构造函数
  2. 创建一个存在用于序列化的类型。完成后,它可以创建您感兴趣的原始类型的实例。它是各种各样的桥梁。
  3. 我个人会选择#2。使类成为仅数据结构并针对序列化和工厂目的进行优化。

答案 2 :(得分:1)

我刚刚运行了一个小测试,使用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?