2011-06-17 22 views
5

phép nói rằng tôi có một lớpserialization không vô giá trị

[Serializable()] 
public class Car 
{ 
    public string model; 
    public int year; 
} 

tôi serialize đó vào đĩa có tên là "car.xx". Sau đó, tôi thêm một tài sản để lớp Car của tôi vì vậy nó sẽ là như thế này:

[Serializable()] 
public class Car 
{ 
    public string model; 
    public int year; 
    public string colour; 
} 

sau đó tôi deserialize "car.xx" (có chứa 2 lĩnh vực) vào lớp xe hiện tại của tôi có chứa 3 lĩnh vực, mà sẽ làm cho thuộc tính "màu" của lớp Xe hơi của chúng tôi null.

Làm cách nào để đặt "thuộc tính mới" không nhận giá trị null? Đặt chúng trong constructor sẽ không giúp đỡ.

Tôi đang sử dụng BinaryFormatter serializer

Tôi muốn các giá trị chuỗi có null để được thay thế bằng ""

+0

bạn đã cố gắng chỉ thiết lập nó như thế này 'màu public string = "red"; '? –

+0

bạn sẽ có gì? nếu có * là * không có màu trong dữ liệu? –

+0

Tôi muốn nó là "" thay vì null – syncis

Trả lời

4

nếu bạn không sử dụng XmlSerializer sau đó xem xét sử dụng OnDeserializedAttribute, OnSerializingAttribute, OnSerializedAttribute, và OnDeserializingAttribute thuộc tính

thấy this.

như:

[Serializable()] 
public class Car 
{ 
    public string colour; 
    public string model; 
    public int year; 

    [OnDeserialized()] 
    internal void OnDeserializedMethod(StreamingContext context) 
    { 
     if (colour == null) 
     { 
      colour = string.Empty; 
     } 
    } 
} 
1

Tất cả đều phụ thuộc vào serializer.

Một số nhà thầu bỏ qua trình nối tiếp; một số serializers chạy hàm khởi tạo mặc định. Một số cho phép bạn chọn. Một số cung cấp gọi lại serialization.

Vì vậy, tùy thuộc vào serializer:

  • viết một constructor parameterless nào để thiết lập một giá trị mặc định (hoặc sử dụng một trường initializer, đó là cuối cùng tương tự)
  • viết một "trên deserializing" serialization callback để thiết lập một mặc định trước khi deserialization

hoặc trường hợp xấu nhất, thực hiện tùy chỉnh serialization (ISerializable/IXmlSerializable/etc, tùy thuộc vào serializer)

Ví dụ, với BinaryFormatter:

[Serializable] 
public class Car : IDeserializationCallback 
{ 
    public string model; 
    public int year; 
    public string colour; 
    void IDeserializationCallback.OnDeserialization(object sender) 
    { 
     if (colour == null) colour = ""; 
    } 
} 

Với serializers khác, nó có thể sử dụng [OnDeserialized] để thay thế. Chú thích; cá nhân tôi sẽ không để lộ các lĩnh vực công cộng, ngay cả trong một DTO. Nhưng nếu bạn đang sử dụng BinaryFormatter, việc thay đổi điều này hiện là thay đổi đột ngột. Để hoàn thành, tôi cũng sẽ không sử dụng BinaryFormatter - đó là không phải là rất thân thiện với điều này. Các serializers khác có sẵn sẽ làm tổn thương bạn ít hơn.

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