具有WCF的非可序列化数据成员

时间:2013-11-12 21:13:44

标签: c# vb.net wcf serialization

我有一个非序列化的对象,我无法访问源代码。有哪些选项可以将其序列化,以便我可以使用WCF通过网络发送它?

没有严重的理由说该对象不可序列化。该类不可序列化,因为它的作者只是没有标记它,我无法访问类。

3 个答案:

答案 0 :(得分:5)

检查出来:

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());
    }
}

显然,您可以将派生类序列化。结果字符串也包含基类属性的值。

答案 1 :(得分:4)

如果从一开始就没有考虑序列化编写类,我建议您创建一个简单的DTO类,它是您的数据契约并将数据复制到该类。为了简化复制,如果有许多属性,可以使用Automapper

将协议合同(WCF数据合同类)合并到一个单独的类中是一个好主意,您可以严格控制它何时/如何更改,因为任何更改都会破坏您服务的客户端。

答案 2 :(得分:1)

您必须创建“代理”,因为您无法更改其他代码。

它可以是包含感兴趣属性的基本DTO / POCO对象。

安德斯已经说过了这个。

这是“模式”的链接

http://www.dofactory.com/Patterns/PatternProxy.aspx

这不是wcf的直接概念。提供这个链接是为了提供一些“思考的食物”。

您可以在[Serializable]对象和原始对象之间编写基本的“翻译器”。