2010-02-25 28 views
30

Tôi có C# POCO thông thường. Ở cấp lớp, tôi đang trang trí đối tượng với [Serializable()].Bỏ qua việc tuần tự hóa nhị phân trên thuộc tính

Điều đó nói rằng, tôi đang sử dụng LINQ Sum() trên một trong các thuộc tính và tôi nhận được lỗi khi tuần tự hóa. Nếu có thể, tôi chỉ muốn bỏ qua tài sản này. Tuy nhiên, [XmlIgnore()] chỉ dành cho Xml Serialization, không phải nhị phân. Bất kỳ ý tưởng hay suy nghĩ nào?

Mã này là một cái gì đó như thế này, nơi tôi muốn bỏ qua ValueTotal:

[Serializable()] 
public class Foo 
{ 
    public IList<Number> Nums { get; set; } 

    public long ValueTotal 
    { 
    get { return Nums.Sum(x => x.value); } 
    } 
} 
+11

Lưu ý điểm lặp lại trong câu trả lời; BinaryFormatter không quan tâm đến tài sản ở nơi đầu tiên ... –

Trả lời

-11

Cheat và sử dụng một phương pháp

[Serializable()] 
public class Foo 
{ 
    public IList<Number> Nums { get; set; } 

    public long GetValueTotal() 
    { 
    return Nums.Sum(x => x.value); 
    } 
} 
+1

+1 trong khi đôi khi tôi đấu tranh với các thuộc tính bằng trạng thái, và trạng thái đôi khi được tính toán, tôi bắt đầu đồng ý hơn rằng nếu bạn đang tính toán, thì bạn nên sử dụng một phương pháp vì nó cho thấy ý định rằng giá trị này là kết quả của phép tính. Sự thật là, tại sao bạn sẽ tuần tự hóa một giá trị được tính toán, không nên bạn tuần tự hóa dữ liệu mà bạn muốn, và sau đó chỉ cần làm lại tính toán ở phía bên kia? – NerdFury

+0

Tôi đồng ý với NerdFury, điều này có thể truyền đạt ý định của tôi tốt hơn. Cảm ơn bạn. -Jessy Houle –

+0

Làm cách nào để giải quyết vấn đề "nhận lỗi khi serialization"? Tôi giả định Số không được tuần tự hóa, do đó việc tuần tự hóa trường sao lưu của thuộc tính Nums sẽ thất bại. – Henrik

32

    [NonSerialized] 
    private IList<Number> nums; 
    public IList<Number> Nums { get {return nums;} set { nums = value; } } 
+1

Đọc lại. Anh ấy thích bỏ qua ValueTotal-Property, không phải danh sách – Scoregraphic

+12

Không cần bỏ qua thuộc tính ValueTotal. Sự tuần tự hóa nhị phân tuần tự hóa các trường, không phải thuộc tính – Henrik

56

ValueTotal đã được bỏ qua. Chỉ dữ liệu được tuần tự hóa, không phải là phương thức. Thuộc tính là phương pháp thực sự.

Nếu bạn muốn bỏ qua các trường và không sắp xếp các trường, hãy đánh dấu chúng là [NonSerialized].

'Hoặc'

bạn có thể triển khai ISerializable và không được sắp xếp hàng loạt trường đó.

Dưới đây là một số mẫu mã trên như thế nào có thể thực hiện ISerializable và serialize dữ liệu: http://www.c-sharpcorner.com/UploadFile/yougerthen/102162008172741PM/1.aspx

+0

Nếu nó là một sự kiện như 'PropertyChangedEventHandler', nó phải được đánh dấu bằng _ [field: NonSerialized] _. Tôi nghĩ điều này sẽ hữu ích cho những người xem câu trả lời của bạn trong tìm kiếm những gì tôi đang tìm kiếm. – Casper

+0

bạn đang tìm kiếm gì? ' – ata

+0

Tôi muốn bỏ qua việc tuần tự hóa một sự kiện trong quá trình tuần tự hóa nhị phân và bài đăng đầu tiên tôi mở là bài đăng này. Tôi thực sự cần dấu _ [field: NonSerialized] _, vì vậy tôi nghĩ rằng nó sẽ hữu ích để bình luận. – Casper

2

Có một cách khác không được liệt kê ở đây là có một số lợi ích (mã dưới đây đã được thực hiện để hỗ trợ cả hai serialization nhị phân và xml) (ví dụ của bạn, bạn sẽ cần một lớp tùy chỉnh để sắp xếp các giao diện của bạn):

[OnSerializing] 
    private void OnSerializing(StreamingContext context) 
    { 
     xmlShape4Port = new xmlStreamShape(shape4Port); 
     shape4Port = null; 
    } 
    [OnDeserialized] 
    private void OnDeserialized(StreamingContext context) 
    { 
     if (xmlShape4Port != null) 
     { 
      shape4Port = xmlShape4Port.getShapeFromSaved(); 
      xmlShape4Port = null; 
     } 
    } 

    [XmlIgnore()] 
    public virtual StreamShape shape4Port {get;set;} 

    [XmlElement("shape4Port")] 
    public xmlStreamShape xmlShape4Port 
    { 
     get 
     { 
      if (shape4Port == null) 
       return null; 
      else 
      { 
       return new xmlStreamShape(shape4Port); 
      } 
     } 
     set 
     { 
      shape4Port = value.getShapeFromSaved(); 
     } 
    } 
Các vấn đề liên quan