【问题标题】:Serialization internals in .Net.Net 中的序列化内部
【发布时间】:2013-04-25 10:13:56
【问题描述】:

我的应用程序中的架构有点像这样

MainUI------->WCF------->BLL------->DAL

我正在使用 Entity Framework 4.0 和 .Net Framework 4.0。

我的数据访问层返回 PoCo 对象,该对象在来回传输对象时会被序列化和反序列化。

现在,当 WCF 在序列化之前返回对象时,这很好,就像我预期的那样,但是当它被反序列化时,它有时会丢失我的自定义对象的一些属性(导航属性),不是一直而是有时。特别是当我通过网络发送自定义对象列表时。它始终返回单个对象的值。

为了记录,我正在使用 DataContract Serializer。

我想了解一下这个序列化/反序列化过程。而且我还想查看序列化对象以及对象被序列化和反序列化的确切点。

【问题讨论】:

    标签: wcf rest serialization deserialization datacontractserializer


    【解决方案1】:

    我不相信有一个简单的方法来调试序列化,但事实上,没有魔法:序列化是一个相当简单的过程,你可以自己做。

    为了记录,我正在使用 DataContract Serializer。

    这是序列化/反序列化的代码

     public static string Serialize(object obj) {
            using(MemoryStream memoryStream = new MemoryStream())
            using(StreamReader reader = new StreamReader(memoryStream)) {
                DataContractSerializer serializer = new DataContractSerializer(obj.GetType());
                serializer.WriteObject(memoryStream, obj);
                memoryStream.Position = 0;
                return reader.ReadToEnd();
            }
        }
    
        public static object Deserialize(string xml, Type toType) {
            using(Stream stream = new MemoryStream()) {
                byte[] data = System.Text.Encoding.UTF8.GetBytes(xml);
                stream.Write(data, 0, data.Length);
                stream.Position = 0;
                DataContractSerializer deserializer = new DataContractSerializer(toType);
                return deserializer.ReadObject(stream);
            }
        }
    

    它有时会遗漏一些属性

    基本上,如果在序列化过程中出现问题,序列化程序会抛出一个 SerializationException(带有详细信息)。在您的情况下(属性仍然为空或等于默认值),听起来您忘记了一些属性。

    好吧,在没有任何代码的情况下为您提供更多帮助并不容易,但请注意 datacontractserializer 功能(请参阅here)。

    尤其是当我通过网络发送自定义对象列表时。它 始终返回单个对象的值。

    尝试重现它并为此编写单元测试。没有随机错误,只有非常具体的导致错误的场景。

    【讨论】:

      【解决方案2】:

      您可以使用 IMessageInspector 扩展点来查看包含您的对象图的消息形状。 See here for implementing IMessageInspector.

      另一种选择是实现OnDeserializing attribute 以获得对序列化进程的访问权限。

      除此之外,您还可以打开 WCF tracing 并在消息越界时捕获它们的详细信息。

      【讨论】:

        猜你喜欢
        • 2021-11-06
        • 2010-09-28
        • 1970-01-01
        • 1970-01-01
        • 2011-11-23
        • 2014-10-24
        • 1970-01-01
        • 2021-07-05
        • 1970-01-01
        相关资源
        最近更新 更多