2012-01-19 30 views
6

Tôi đã tìm thấy nhiều giải pháp ở đây tại SO và khác là thỏa thuận với bản sao sâu của đối tượng thông qua serialization/deserialization (vào bộ nhớ và trở lại).Nhân bản đối tượng mà không cần serialization

Yêu cầu các lớp được sao chép phải được đánh dấu bằng [Serializable]. Tôi xảy ra để có các lớp học của tôi (cũng hầu hết trong số họ) được đánh dấu bằng [DataContract] vì tôi sử dụng DataContractSerializer để tuần tự hóa thành XML.

Tôi chỉ giới thiệu thuộc tính [Serializable] vì sự cần thiết phải sao chép sâu của một số trường hợp lớp này. Tuy nhiên, bây giờ một cái gì đó đã xảy ra để serialization/deserialization thông qua DCS bởi vì nó không hoạt động nữa - lỗi về mong đợi một phần tử XML khác nhau trên deserialization. Nếu tôi xóa [Serializable], các lỗi sẽ biến mất.

Tùy chọn của tôi là gì? Tôi chỉ muốn sao chép các vật thể của mình càng đơn giản càng tốt.

+0

Bạn có thể sử dụng sự phản chiếu, nhưng điều đó cũng có thể phải chịu một chi phí hiệu suất nhỏ. – IDWMaster

+0

Tại sao bạn cần [Serializable] ở đây? Bạn có thể sử dụng DCS cho bản sao sâu ...? Chỉ cần serialize nó vào một MemoryStream thông qua DCS ...? –

+0

vâng tôi vừa nghĩ ra một thứ gì đó, tôi sẽ đăng nó – mare

Trả lời

9

này hoạt động

public static T DeepClone<T>(this T a) 
    { 
     using (MemoryStream stream = new MemoryStream()) 
     { 
      DataContractSerializer dcs = new DataContractSerializer(typeof(T)); 
      dcs.WriteObject(stream, a); 
      stream.Position = 0; 
      return (T)dcs.ReadObject(stream); 
     } 
    } 
1

Json serialization và deserialization nên làm việc, nó không đòi hỏi các lớp học để có serialize chú thích.

public static T DeepCopy<T>(this T source) 
{ 
    return JsonConvert.DeserializeObject<T>(JsonConvert.SerializeObject(source)); 
} 
Các vấn đề liên quan