2010-08-09 18 views
6

Tôi đang tuần tự hóa từ điển thành XML. Khi tôi tạo ra một từ điển mới tôi sử dụng các nhà xây dựng để cung cấp EqualityComparer không vỏ ví dụSerializing Dictionary <string, object> khi từ điển được khởi tạo với so sánh chuỗi không phân biệt chữ hoa chữ thường

var tabs = new Dictionary<string,Tab>(StringComparer.OrdinalIgnoreCase); 

sau đó tôi serialize đến XML và khi tôi deserialize thông tin về vỏ bị mất - deserialization được thực hiện cho các từ điển với GenericEqualityComparer, mà rõ ràng là trường hợp nhạy cảm, bởi vì nó không tìm thấy chìa khóa của tôi nếu họ không phải là cased một cách chính xác.

Mọi ý tưởng làm cách nào để thay đổi?

Có một cách để tạo một từ điển mới và sao chép dữ liệu từ phần được định hướng lại sang từ mới nhưng điều này có vẻ phiền hà.

UPDATE:

Các deserialization làm việc toàn bộ thời gian nó chỉ là rằng nó deserializes Từ điển serialized một mà không sử dụng trường hợp phím không nhạy cảm.

+0

Liệu vấn đề này xảy ra khi bạn sử dụng DataContract? –

+0

có, lớp có chứa thuộc tính kiểu Từ điển được đánh dấu là DataContract và thuộc tính này được đánh dấu là DataMbember, nếu đó là những gì bạn muốn biết – mare

+0

Có, nhưng bây giờ bạn đã tìm ra rằng nó hoạt động trong .NET 4.0, không có gì để tôi theo dõi. Chúc mừng bạn đã giải quyết được vấn đề của mình. –

Trả lời

4

Tôi biết câu hỏi này khá cũ, nhưng gần đây tôi thấy mình đang tìm cách thực hiện việc này.

Sử dụng .Net4 (như @mare đã nói), bạn có thể tạo một số phương pháp mở rộng thực sự tốt đẹp để thực hiện điều này một cách dễ dàng. Hãy xem https://stackoverflow.com/a/5941122/435460 để có triển khai tốt và đơn giản.

Sau nhiều lần đào, điều này đã hoạt động như một sự quyến rũ đối với tôi.

3

Edit:

mỗi ý kiến, nó xuất hiện cách tiếp cận này có thể bị lỗi thời trong .NET 4.

End Sửa

Từ điển xảy ra để đòi hỏi một chút giúp đỡ để serialize và deserialize.

Đây là một ví dụ tốt về một cuốn từ điển Serializable XML:

http://weblogs.asp.net/pwelter34/archive/2006/05/03/444961.aspx

Bạn có thể làm cho nó phân biệt dạng chữ bằng cách thay đổi khai báo lớp và thêm một constructor, và tinh chỉnh một đường thẳng.

** CHỈNH SỬA: Lỗi cú pháp được sửa bên dưới./EDIT **

public class SerializableDictionary<TValue> 
    : Dictionary<string, TValue>, IXmlSerializable 
{ 
    public SerializableDictionary() 
     : base(StringComparer.InvariantCultureIgnoreCase) 
    { 
    } 

    // ... 
} 

Thay đổi dòng this.Add(key, value); thành this[key] = value;.

Ở mức độ nào, bạn có thể cần phải xoa bóp một số chi tiết, nhưng điều này sẽ giúp bạn có được tốt trên đường.

+0

Làm việc với .NET 4 có vẻ như từ điển chung có thể tuần tự hóa được, vì nó làm việc cho tôi. Tôi không chắc chắn nếu thực hiện một giải pháp từ năm 2006 là khuyến khích, cho rằng việc thực hiện từ điển mới hoặc thực hiện DataContractSerializer hỗ trợ serialization/deserialization từ điển out-of-the-box. – mare

+0

@mare: Hey, đó là tin tốt! Vui lòng xem xét việc cập nhật thẻ thành .NET 4 và tôi sẽ đặt bản chỉnh sửa trên bài đăng của mình. – kbrimington

+0

Không biên dịch vì khai báo tham số kiểu 'phải là một mã định danh không phải là một kiểu' cho' chuỗi' trong 'SerializableDictionary '. – JoeBilly

1

Bạn chỉ cần quấn lên từ điển mới của bạn vào vị thi công:

Dictionary<string, Tab> tabs ; 
tabs = new Dictionary<string, Tab>((Dictionary<string, Tab>)serializer.ReadObject(reader),StringComparer.OrdinalIgnoreCase); 
1

Một câu hỏi cũ Tôi nhận ra, nhưng chỉ đào qua các nguồn để Dictionary và nhận thấy rằng nó nên trên thực tế serialize các Comparer:

info.AddValue(ComparerName, comparer, typeof(IEqualityComparer<tkey>)); 

Sau đó, trong việc thực hiện IDeserializationCallback.OnDeserialization nó lấy Comparar:

comparer = (IEqualityComparer<tkey>)m_siInfo.GetValue(ComparerName, typeof(IEqualityComparer<tkey>)); 

Các lớp thực hiện giao diện IDeserializationCallback chỉ định một phương thức sẽ được thực thi sau khi một cá thể đã được deserialized, nhưng trước khi nó được trả về mã của bạn.

Ref: Dictionary.cs GetObjectData và OnDeserialization phương pháp

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