2011-07-12 44 views
9

Trong ứng dụng Máy khách/Máy chủ của chúng tôi, chúng tôi đã sử dụng BinaryFormatter cho quá trình tuần tự hóa. Vì lý do hiệu suất, chúng tôi đang cố di chuyển sang protobuf-net (http://code.google.com/p/protobuf-net/).Làm thế nào để so sánh hai đồ thị đối tượng .NET cho sự khác biệt?

Phần mềm của chúng tôi truyền các biểu đồ lớn với chu kỳ giữa Máy khách và Máy chủ.

Bây giờ tôi đang tìm một cách để đảm bảo rằng dữ liệu đã được tuần tự hóa và deserialized bằng cách sử dụng protobuf là chính xác giống như một trong đó thường được xử lý bởi BinaryFormatter.

So sánh từng chút một là đơn giản: Tôi tuần tự hóa bằng BinaryFormatter vào tệp. Deserialize tập tin này một lần nữa bằng cách sử dụng BinaryFormatter. Sau đó, tôi tuần tự hóa bằng cách sử dụng ProtoBuf vào một tập tin. Deserialize sử dụng ProtoBuf từ tập tin đó. Nối tiếp lại bằng BinaryFormatter thành tệp.

Sau đó, tôi có thể chỉ cần so sánh tệp đó với tệp gốc.

Tuy nhiên, hai tệp đó không bằng 100%. Vì vậy, bây giờ tôi cần phải tìm một cách để theo dõi sự khác biệt xuống.

Có một số công cụ có thể hiển thị dữ liệu đã được BinaryFormatter tuần tự hóa không? Hay bạn có biết một số người trợ giúp khác mà so sánh sâu và cho tôi biết sự khác biệt ở đâu?

Sử dụng XMLSerializer và so sánh hai tệp XML là không thể vì BinaryFormatter có thể tuần tự hóa nhiều dữ liệu hơn XMLSerializer - ngay cả khi không đánh dấu các trường một cách rõ ràng.

Cảm ơn bạn, TH

+0

Tôi có rất nhiều mã ở đây trên SO để so sánh các đối tượng riêng lẻ, nhưng so sánh toàn bộ biểu đồ là ... phức tạp. Nếu tôi phải * đoán *, tôi sẽ tự hỏi nếu có sự khác biệt chính xác datetime nhỏ. –

+0

Xin chào Marc. Nếu các tập tin gần như giống hệt nhau, tôi sẽ đoán như vậy. Tuy nhiên, tôi thiếu khoảng 25% dữ liệu. Bây giờ tôi tự hỏi nếu, ví dụ, tham chiếu cá thể đã được chia sẻ mặc dù họ không nên (vì các tài liệu tham khảo ban đầu đã không trỏ đến cùng một đối tượng) hoặc nếu tôi chỉ quên thêm một số trường vào TypeModel. Một số công cụ sẽ là tuyệt vời mà chỉ cần vẽ đồ thị toàn bộ đồ thị cho một biểu đồ có thể đọc được của con người (tương tự như http://ignatu.co.uk/ViewStateDecoder.aspx (tuy nhiên thuật toán đó không hoạt động với đồ thị lớn của chúng tôi)) – TwinHabit

Trả lời

5

Làm thế nào về việc sử dụng DataContractSerializer với đối tượng theo dõi được kích hoạt (preserveObjectReferences trong constructor). Điều đó nên cho phép bạn tuần tự hóa chúng thành xml (ít nhất là một loại), nơi bạn có thể so sánh sự khác biệt.

+0

Ý tưởng tuyệt vời. Tôi sẽ cho nó một viên đạn. Btw Tôi chỉ tìm thấy một sự khác biệt rất lớn mà là kết quả của việc xử lý tham chiếu không thành công. Vấn đề ở đây là Object mà chúng ta đang sắp xếp là một List. Tuy nhiên, tôi không tìm thấy khả năng trong API của bạn để chỉ định rằng theo dõi tham chiếu nên được bật cho đối tượng cấp cao nhất này. Tôi chỉ biết có thể kích hoạt nó trên Thành viên. Vì vậy, một cách giải quyết khác là cung cấp lớp chứa cho bộ sưu tập và bật Theo dõi tham chiếu trên bộ sưu tập được chứa. Nhưng cho phép nó trên đối tượng cấp cao nhất sẽ mượt mà hơn. Điều đó đã có thể? – TwinHabit

+0

@TwinHabit không có thay đổi đáng kể, tôi sợ - bộ đệm giao thức hoàn toàn không có khái niệm * danh sách như một đối tượng *, dẫn đến một số điểm kỳ quặc. Nó * chỉ * biết về các mục. Về cơ bản, trên dây bạn nhận được "cha mẹ con con con" - không bao giờ "cha mẹ danh sách con con con" (nếu bạn thấy những gì tôi có ý nghĩa) –

+0

Có lẽ chúng ta có thể nâng cao thư viện bằng một tính năng trong suốt di chuyển các đối tượng thế nào để tạo ra các lớp container? Điều đó sẽ giải quyết hai vấn đề: Người ta có thể dễ dàng mang theo các trường có danh sách tùy chỉnh cũng như kích hoạt tính năng Theo dõi tham chiếu trong Đối tượng danh sách cấp cao nhất. Vấn đề chúng tôi đang gặp bây giờ là chúng ta sẽ phải thay đổi giao diện máy khách/máy chủ vì một số phương thức chỉ trả về danh sách .. nhưng chúng ta hãy xem. Có lẽ tôi có thể thuyết phục họ. – TwinHabit

5

Chúng tôi đã có cùng một vấn đề. Chúng tôi Json tuần tự hóa hai đối tượng (với định dạng, thụt dòng, dòng mới vv) và sau đó sử dụng một văn bản đơn giản khác. Nó sẽ cho bạn biết không chỉ rằng chúng khác nhau, nhưng chính xác sự khác biệt là gì.

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