2009-07-16 28 views
16

Tôi có một lớp học sử dụng một số XmlSerializer trong các phương thức Read/WriteXml của nó. Bộ nối tiếp hiện tại là private readonly.Tôi có nên đặt XmlSerializer này tĩnh không?

public class Foo : IXmlSerializable 
{ 
    private Bar _bar = new Bar(); 
    private readonly XmlSerializer serBar = new XmlSerializer (typeof (Bar)); 

    public void WriteXml (XmlWriter writer) 
    { 
     serBar.Serialize (writer, Bar); 
    } 
    // ... 
} 

Tôi đang cân nhắc tạo Serializer private static thay vào đó, vì vậy một phiên bản được chia sẻ giữa tất cả các Foos. Đây có phải là một ý tưởng hay, hoặc có vấn đề gì không?

Trả lời

30

Vâng, đó là một ý tưởng hay. Không, không có vấn đề gì với nó cả. Đặc biệt, chủ đề an toàn là không một vấn đề - từ MSDN documentation for XmlSerializer class:

Chủ đề An toàn

loại này là chủ đề an toàn.

+2

Ah, tuyệt vời, điều này sẽ là câu trả lời được chấp nhận trừ khi somet hing mới xuất hiện. :) – mafu

3

Có. Nói chung, bạn sẽ muốn làm điều này cho tất cả các lớp serializer của bạn. Nó có thể tăng tốc đột ngột lên ứng dụng của bạn

Cách dễ nhất để làm điều này là:

public static class MySerializers { 
    public static XmlSerializer MyType = new XmlSerializer(typeof(MyType));  
} 

Sau đó, khi bạn cần một serializer bạn chỉ có thể gọi:

MySerializers.MyType 

Cũng lưu ý rằng theo C# ngữ nghĩa, các lớp tĩnh được khởi tạo vào lần sử dụng đầu tiên, không phải lúc tải. Nếu bạn muốn đặt tất cả các chi phí tải lên phía trước, bạn sẽ cần phải truy cập một cách rõ ràng lớp.

+0

Ý tưởng hay, cảm ơn! +1 – mafu

5

Một cách sẽ được để tạo ra một nhà máy XmlSerializers và tham khảo nó tĩnh (hoặc như là một tài liệu tham khảo IoC), một cái gì đó như:

public class XmlSerializerFactory 
{ 
    public XmlSerializer GetSerializerFor<T>() 
    { 
     lock (this) 
     { 
      Type typeOfT = typeof(T); 
      if (false == serializers.ContainsKey(typeOfT)) 
      { 
       XmlSerializer newSerializer = new XmlSerializer(typeOfT); 
       serializers.Add(typeOfT, newSerializer); 
      } 

      return serializers[typeOfT]; 
     } 
    } 

    private Dictionary<Type, XmlSerializer> serializers = new Dictionary<Type, XmlSerializer>(); 
} 
+0

Rất kém hiệu quả. Câu trả lời PROGrand tốt hơn nhiều: khóa trên T1 sẽ không chặn T2. – Vlad

13

Theo Neal - thậm chí phổ biến và an toàn hơn thông qua Generics và readonly:

public static class Helper<T> 
{ 
    public static readonly XmlSerializer Serializer = new XmlSerializer(typeof(T)); 
} 

Use as:

Helper<My>.Serializer 
Các vấn đề liên quan