它是可能的序列化的对象,没有无参构造中WCF?
-
03-07-2019 - |
题
我知道,一个私人无参构造的工作,但是怎么样的一个目没有无参造?
我想让类型,从一个第三方图书馆,所以我无法控制的种类型的定义。
如果有一个方式是什么,是最简单的?E.g。我没什么必须创建一个子类型。
编辑:
我在寻找什么东西喜欢的等级定制下所示: http://msdn.microsoft.com/en-us/magazine/cc163902.aspx 虽然我不想要流serialize/deserialize.
解决方案
你真的不能让任意的类型序列化;在某些情况下(XmlSerializer
, 例如)运行时公开的选择欺骗的属性。但 DataContractSerializer
不允许这样做。可行的选择:
- 隐藏在课后你自己的类型 都 序列化的(大量的工作)
- 提供的二元格式化的代理人(yeuch)
- 写你自己的化的核心(很多工作要得到的权利)
实际上,如果东西是不是 设计 对于化,很小的框架 让 你serialize。
其他提示
我不是WCF专家,但它们不太可能支持具有任意类型的构造函数的序列化。也就是因为他们会传递什么价值?您可以为结构的引用类型和空值传递null。但是,如果用完全空的数据构建一个类型会有什么好处呢?
我认为你坚持使用2个选项之一
- 子类有问题的类型,并将适当的默认值传递给非无参数构造函数
- 创建一个存在用于序列化的类型。完成后,它可以创建您感兴趣的原始类型的实例。它是各种各样的桥梁。 醇>
我个人会选择#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],这实际上是有效的。有趣的是,它似乎不需要客户端的默认构造函数。这里有一个相关的帖子:
不隶属于 StackOverflow