2008-10-07 31 views
78

Có một số phép thuật xảy ra với WCF deserialization. Làm thế nào để nó khởi tạo một thể hiện của kiểu hợp đồng dữ liệu mà không cần gọi hàm tạo của nó?Làm thế nào để WCF deserialization nhanh chóng đối tượng mà không cần gọi một constructor?

Ví dụ, hãy xem xét hợp đồng dữ liệu này:

[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 
} 

Khi lấy một thể hiện của đối tượng này thông qua DataContractSerializer bạn sẽ thấy rằng trường _wasConstructorCalledfalse.

Vậy WCF làm như thế nào? Đây có phải là một kỹ thuật mà những người khác có thể sử dụng quá, hoặc là nó ẩn xa chúng ta?

Trả lời

99

FormatterServices.GetUninitializedObject() sẽ tạo một phiên bản mà không cần gọi hàm tạo. Tôi tìm thấy lớp này bằng cách sử dụng Reflector và đào qua một số lớp .Net serialization cốt lõi.

Tôi đã thử nghiệm nó bằng cách sử dụng mã mẫu dưới đây và có vẻ như nó hoạt động tuyệt vời:

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

+5

Vâng, trước đây tôi đã đăng câu trả lời sai (hiện đã bị xóa) nên tôi cảm thấy có lỗi. Không có gì như bầm bầm một lập trình bản ngã để có được anh ta để làm một số nghiên cứu. –

+2

Có ai khác đang tự hỏi không, FormatterServices.GetUninitializedObject hoạt động như thế nào? Phản ánh? – harpo

+0

Nếu tôi gọi lại cuộc gọi của mình thành mã gốc. Tôi không thể làm theo điều này xa hơn nữa trong hố thỏ với Reflector. –

Các vấn đề liên quan