【问题标题】:Non-Serializable data member with WCFWCF 的不可序列化数据成员
【发布时间】:2013-11-12 21:13:43
【问题描述】:

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

对象不可序列化没有严重的原因。该类是不可序列化的,因为它的作者只是没有那样标记它,而且我无权访问该类。

【问题讨论】:

    标签: c# vb.net wcf serialization


    【解决方案1】:

    看看这个:

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

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

    【讨论】:

    • 谢谢!我看到你正在使用内存流。我不能通过网络直接发送内存流(bytearray)吗?请原谅我的无知,这只是一个想法——如果内存字节有效,为什么我需要发送 XML?
    • @user1630853 这只是我对基类属性序列化的概念证明。 XML 序列化具有人类可读且简单的优点。使用适合您的最简单的序列化。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      安德斯已经说过了。

      这是“模式”的链接

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

      这不是直接指向 wcf 的概念。提供该链接是为了提供一些“深思熟虑”。

      您可以在您的 [Serializable] 对象和原始对象之间编写一个基本的“转换器”。

      【讨论】:

        猜你喜欢
        • 2012-08-11
        • 1970-01-01
        • 2015-07-20
        • 1970-01-01
        • 2015-09-11
        • 1970-01-01
        • 2010-10-22
        • 1970-01-01
        • 2016-05-07
        相关资源
        最近更新 更多