我有一个非序列化对象,我无权访问源代码。有哪些选项可以使其可序列化,以便我可以使用 WCF 通过网络发送它?
对象不可序列化没有严重的原因。该类不可序列化,因为它的作者只是没有那样标记它,而且我无权访问该类。
我有一个非序列化对象,我无权访问源代码。有哪些选项可以使其可序列化,以便我可以使用 WCF 通过网络发送它?
对象不可序列化没有严重的原因。该类不可序列化,因为它的作者只是没有那样标记它,而且我无权访问该类。
看一下这个:
public class Base
{
public string Name { get; set; }
public List<int> Values { get; set; }
}
[Serializable]
public class Derived : Base
{
public double X { get; set; }
}
class Program
{
static void Main(string[] args)
{
var d = new Derived() { X = 3.1415, Values = new List<int> { 3, 1, 4, 1, 5 }, Name = "Pi" };
var stream = new MemoryStream();
new XmlSerializer(typeof(Derived)).Serialize(stream, d);
string result = Encoding.UTF8.GetString(stream.GetBuffer());
}
}
显然,您可以使派生类可序列化。结果字符串也包含基类属性的值。
如果该类从一开始就没有考虑到序列化,我建议您创建一个简单的DTO类作为您的数据合同并将数据复制到该类。如果有很多属性,为了简化复制,您可以使用Automapper 。
将协议合同(WCF 数据合同类是)分离到一个单独的类中始终是一个好主意,您可以严格控制它何时/如何更改,因为任何更改都会破坏您的服务客户端。
您必须创建一个“代理”,因为您无法更改其他代码。
它可以是包含感兴趣属性的基本 DTO/POCO 对象。
安德斯已经说过了。
这是“模式”的链接
http://www.dofactory.com/Patterns/PatternProxy.aspx
它不是直接指向 wcf 的概念。提供该链接是为了提供一些“思考的食物”。
您可以在 [Serializable] 对象和原始对象之间编写一个基本的“转换器”。