2010-06-10 30 views
9

Có thể đặt theo chương trình mà bạn muốn loại trừ thuộc tính khỏi tuần tự hóa không?Thuộc tính được đặt theo chương trình để loại trừ khỏi việc tuần tự hóa

Ví dụ:

  • Khi de-serializing, tôi muốn tải lên một trường ID
  • Khi serializing, tôi muốn KHÔNG xuất trường ID
+0

Để có câu trả lời tốt hơn, đề nghị bạn làm rõ cơ chế tuần tự hóa của mình - ví dụ:XML serialization, Data Contract serialization, vv – Reddog

Trả lời

18

Tôi tin rằng có ba tùy chọn ở đây:

  1. Sử dụng XmlIgnore thuộc tính. Nhược điểm là bạn cần biết trước những thuộc tính nào bạn muốn xmlserializer bỏ qua.

  2. Triển khai giao diện IXmlSerializable. Điều này cho phép bạn hoàn toàn kiểm soát đầu ra của XML, nhưng bạn cần phải tự mình thực hiện các phương thức đọc/ghi.

  3. Triển khai giao diện ICustomTypeDescriptor. Tôi tin rằng điều này sẽ làm cho giải pháp của bạn để làm việc không có vấn đề gì loại serialization bạn chọn, nhưng nó có lẽ là giải pháp dài nhất của tất cả.

 

5

Nếu bạn đang serializing để XML, bạn có thể sử dụng XMLIgnore

Như trong:

class SomeClass 
{ 
    [XmlIgnore] int someID; 
    public string someString; 
} 
+2

... và thuộc tính NonSerialized nếu bạn đang sử dụng BinaryFormatter hoặc SoapFormatter. – Joe

2

Nếu bạn đang sử dụng chuỗi tuần tự hóa XML, hãy sử dụng thuộc tính [XmlIgnore]. Nếu không, làm thế nào để bỏ qua một thuộc tính cụ thể được xác định bởi chính bộ nối tiếp.

4

Nếu bạn muốn bao gồm trường trong quá trình tuần tự hóa nhưng bỏ qua trong quá trình deserialization thì bạn có thể sử dụng OnDeserializedAttribute để chạy một phương pháp sẽ đặt giá trị mặc định cho trường ID.

14

Nó phụ thuộc vào loại serialization. ví dụ ở đây đầy đủ để thực hiện điều này với BinaryFormatter:

Bạn có thể sử dụng OnDeserializedAttribute:

[Serializable] 
class SerializableEntity 
{ 
    [OnDeserialized] 
    private void OnDeserialized() 
    { 
    id = RetrieveId(); 
    } 

    private int RetrievId() {} 

    [NonSerialized] 
    private int id; 
} 

Và có một cách khác để làm điều này bằng IDeserializationCallback:

[Serializable] 
class SerializableEntity: IDeserializationCallback 
{ 
    void IDeserializationCallback.OnDeserialization(Object sender) 
    { 
    id = RetrieveId(); 
    } 

    private int RetrievId() {} 

    [NonSerialized] 
    private int id; 
} 

Ngoài ra bạn có thể đọc lớn Jeffrey Richter bài viết về tuần tự hóa: part 1part 2.

+0

Việc đầu tiên đã cho tôi gặp rắc rối nhưng thứ hai hoạt động hoàn hảo. – Stoopkid

3

Bài đăng cũ, nhưng tôi thấy mẫu ShouldSerialize http://msdn.microsoft.com/en-us/library/53b8022e%28VS.71%29.aspx Điều đó thực sự hữu ích !!!

+0

Có lẽ là giải pháp đơn giản và hữu ích nhất để kiểm soát tuyệt đối về việc tuần tự hóa hoặc không thuộc tính trong thời gian chạy! Tôi đã từng sử dụng nó khi tôi đang phát triển các điều khiển người dùng trong các hình thức cửa sổ. – xisket

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