WCF反序列化有一些神奇之处.它如何在不调用其构造函数的情况下实例化数据协定类型的实例?

例如,考虑这个数据契约:

[DataContract]
public sealed class CreateMe
{
   [DataMember] private readonly string _name;
   [DataMember] private readonly int _age;
   private readonly bool _wasConstructorCalled;

   public CreateMe()
   {
      _wasConstructorCalled = true;
   }

   // ... other members here
}

通过DataContractSerializer获取此对象的实例时,您将看到字段_wasConstructorCalledfalse.

那么,WCF是如何做到这一点的呢?这是一种其他人也可以使用的技术,还是隐藏在我们面前?

推荐答案

FormatterServices.GetUninitializedObject()将在不调用构造函数的情况下创建实例.我通过使用Reflector和挖掘一些核心发现了这个类.Net序列化类.

我使用下面的示例代码对其进行了测试,它看起来工作得很好:

using System;
using System.Reflection;
using System.Runtime.Serialization;

namespace NoConstructorThingy
{
    class Program
    {
        static void Main()
        {
            // does not call ctor
            var myClass = (MyClass)FormatterServices.GetUninitializedObject(typeof(MyClass));

            Console.WriteLine(myClass.One); // writes "0", constructor not called
            Console.WriteLine(myClass.Two); // writes "0", field initializer not called
        }
    }

    public class MyClass
    {
        public MyClass()
        {
            Console.WriteLine("MyClass ctor called.");
            One = 1;
        }

        public int One { get; private set; }
        public readonly int Two = 2;
    }
}

http://d3j5vwomefv46c.cloudfront.net/photos/large/687556261.png

.net相关问答推荐

WinForm Task.Wait :为什么它会阻塞 UI?

Visual Studio 2022 中的目标操作系统和目标运行时有什么区别?

使用 PEM 文件创建 DSA 签名

在 WebApi 中需要 SSL?

.NET - WindowStyle = hidden 与 CreateNoWindow = true?

使用字典作为数据源绑定组合框

.NET 应用程序的链接器状态(又名请先生,我可以有一个链接器2009 年版)

.net:System.Web.Mail 与 System.Net.Mail

读取方法的属性值

基于多个字符分隔符拆分字符串

什么版本的 .NET 附带什么版本的 Windows?

Iif 在 C# 中等效

监听依赖属性的变化

哪个密码字符在 winforms 文本框中显示黑点 (•)?

Moq - 不可覆盖的成员不能用于设置/验证表达式

在关闭警告中访问 foreach 变量

DataContractSerializer vs XmlSerializer:每个序列化器的优缺点

是否可以判断对象是否已附加到实体框架中的数据上下文?

在类型 c# 上切换大小写

如何使用匿名方法返回值?