2009-08-26 18 views
9

Cho một lớp như thế này:thử nghiệm cho Optional Dòng khi sử dụng .NET Tuỳ chỉnh serialization

[Serializable] 
public class MyClass { 
    string name; 
    string address; 

    public MyClass(SerializationInfo info, StreamingContext context){ 
     name = info.GetString("name"); 
     if(/* todo: check if a value for address exists */) 
      address = info.GetString("address"); 
    } 

    public void GetObjectData(SerializationInfo info, StreamingContext context){ 
     info.AddValue(name); 
     if(address != null) 
      info.AddValue(address); 
    } 
} 

Làm thế nào để kiểm tra xem một giá trị cho trường address tồn tại trước khi gọi info.GetString(address)?

Có, tôi hiểu rằng tôi có thể chỉ cần viết một trường rỗng address nhưng vấn đề thực sự của tôi là các phiên bản trước đó của MyClass, không có trường địa chỉ.

Lưu ý: Tôi có lý do chính đáng để sử dụng tùy chỉnh tuần tự hóa. Có một số lĩnh vực tĩnh đang được sử dụng như đơn và deserialization mặc định sẽ không tôn trọng điều đó.

Trả lời

13

Vâng, một cách tiếp cận hấp dẫn là bạn có thể sử dụng GetEnumerator (foreach) để lặp qua cặp tên/giá trị, sử dụng tên switch để xử lý mỗi lần lượt?

Triển khai có vẻ hơi không chuẩn; từ ví dụ here:

SerializationInfoEnumerator e = info.GetEnumerator(); 
    Console.WriteLine("Values in the SerializationInfo:"); 
    while (e.MoveNext()) 
    { 
     Console.WriteLine("Name={0}, ObjectType={1}, Value={2}", 
      e.Name, e.ObjectType, e.Value); 
    } 

Nhưng có vẻ như bạn cũng có thể sử dụng SerializationEntry:

[Serializable] 
class MyData : ISerializable 
{ 
    public string Name { get; set; } 
    public int Value { get; set; } 

    public MyData() { } 
    public MyData(SerializationInfo info, StreamingContext context) 
    { 
     foreach (SerializationEntry entry in info) 
     { 
      switch (entry.Name) 
      { 
       case "Name": 
        Name = (string)entry.Value; break; 
       case "Value": 
        Value = (int)entry.Value; break; 
      } 
     } 
    } 

    public void GetObjectData(SerializationInfo info, StreamingContext context) 
    { 
     info.AddValue("Name", Name); 
     info.AddValue("Value", Value); 
    } 
}