2013-08-14 43 views
6

Một tuần trước, tôi gặp phải tình huống mà tôi phải đọc một đối tượng được tuần tự hóa nhị phân do một ứng dụng khác tạo ra bởi người khác. Tôi chỉ có tệp someSerializedData.bin, vì vậy tôi đã cố gắng tạo lại định nghĩa lớp cho đối tượng không xác định theo cách thủ công và tôi có thể làm như vậy, vì siêu dữ liệu trong tệp được tuần tự hóa. Thật kỳ lạ, tôi không thể tìm thấy bất kỳ công cụ nào trên google..NET Siêu dữ liệu tuần tự hóa nhị phân

Q1: Tại sao không có công cụ tạo lại định nghĩa lớp từ tệp/dữ liệu được tuần tự hóa nhị phân?

Và nó dẫn đến câu hỏi thứ hai của tôi

Q2: Có trường hợp như vậy khi nó không thể khôi phục lại định nghĩa lớp từ dữ liệu tuần tự? (Giả sử nó không được mã hóa hoặc làm xáo trộn theo bất kỳ cách nào, tôi quan tâm đến các trường hợp liên quan đến thuộc tính .NET Binaryserializer "mặc định", để vô hiệu hóa thông tin loại và siêu dữ liệu được bao gồm)

+2

Xin vui lòng không chỉ downvote, cho tôi biết những gì sai, vì vậy tôi có thể cải thiện câu hỏi. –

+0

tôi nghĩ rằng những gì u đang tìm kiếm được gọi là phản ánh (lấy mã máy và đảo ngược nó trở lại C#) tôi có phải không? – Liran

+1

Bạn có bản sao của ứng dụng tạo tệp .bin không? Nếu có, bạn có thể loại bỏ nó và xem mã. Xem dotPeak: http://www.jetbrains.com/decompiler/ – dana

Trả lời

1

Lý do không có công cụ nào vì không đủ để tạo loại chỉ chứa dữ liệu. Các phương thức thường chỉ quan trọng như dữ liệu, đặc biệt là với các thuộc tính không chỉ thiết lập các biến riêng của chúng. Không ai biết những phương pháp đó là gì.

Với điều đó đã nói, có thể hữu ích khi có một công cụ ít nhất có khả năng tạo ra một loại để giữ dữ liệu. Có lẽ bạn sẽ là người đầu tiên tạo ra một công cụ như vậy?

2

Không thể deserialize dữ liệu nhị phân mà không biết những gì trong đó. Cách duy nhất để làm điều này là tuần tự hóa nó bằng cách sử dụng JSON hoặc XML chẳng hạn. Ví dụ minh họa:

Tên của bạn "Thông thường" có thể được đăng theo cách này: 67,97,115,117,97,108. Trong trường hợp bạn không nhận thấy: điều này được thực hiện bằng cách sử dụng mã ASCII (nếu tôi không phạm sai lầm nào). Vì vậy, bây giờ, hãy tưởng tượng bạn không biết điều này được thực hiện với ASCII, người nói rằng đây không chỉ là một mảng với các con số? Hoặc 3 mảng 2 số? Hoặc một đối tượng có ID 67 và một đối tượng có ID 117. Không ai biết nhiệm vụ của bạn là không thể.

Tùy chọn duy nhất là liên lạc với người đã tuần tự hóa nó ban đầu và hỏi anh ta/cô ấy làm thế nào điều này được thực hiện và những đối tượng được đăng trong đối tượng nhị phân này.

Trân trọng

+1

Chúng tôi đang nói về tuần tự hóa nhị phân .NET, không được tuần tự hóa tùy chỉnh. Câu hỏi của tôi không phải là nếu tôi có thể hoặc không thể deserialize một đối tượng không rõ. (btw nó có thể do các dữ liệu meta bao gồm -> câu hỏi/17996701/nhị phân-deserialization-không-đối tượng-định nghĩa) Câu hỏi của tôi là nếu bạn có thể serialize với Binaryformatter (không tùy chỉnh!) mà không có nhiều siêu dữ liệu, có thể viện trợ bất cứ ai để khôi phục lại định nghĩa lớp gốc của đối tượng. Cảm ơn bạn cho câu trả lời anyway :) –

+0

@Casual * Câu hỏi của tôi là nếu bạn có thể tuần tự hóa với Binaryformatter (không được tùy chỉnh!) Mà không có nhiều siêu dữ liệu đó sẽ giúp mọi người khôi phục định nghĩa lớp gốc của đối tượng *, ** Không ** câu hỏi của bạn không phải là ... Nó không phải là bằng * Có trường hợp như vậy khi nó không thể khôi phục lại định nghĩa lớp học từ các dữ liệu tuần tự? * –

1

Tôi không chắc chắn có đủ thông tin trong siêu dữ liệu để tạo lại loại. Hãy tưởng tượng đồ thị đối tượng phức tạp (như lồng nhau). Trong câu hỏi trước của bạn, các loại thành viên (String vs int) đã là một vấn đề.

Về câu hỏi thứ hai của bạn, tôi không chắc chắn những gì bạn cố gắng đạt được. Tôi không chắc chắn nếu bạn có thể sử dụng BinaryFormatter để xuất dữ liệu theo cách không phải là quá dễ dàng để đảo ngược kỹ sư, nhưng các phương pháp khác nên được đơn giản để thực hiện.

+1

chuỗi vs int chỉ là một vấn đề bởi vì ông đã đoán tại các loại thay vì đọc dữ liệu nhị phân thực tế. – Will

2

Q1: Tại sao không có công cụ tạo lại định nghĩa lớp từ tệp/dữ liệu được tuần tự hóa nhị phân?

Tôi đoán là rất ít người cần điều này. Để bắt đầu, việc tuần tự hóa nhị phân không phổ biến như XML, JSON và các định dạng khác được chuẩn hóa và được hỗ trợ hầu như ở bất kỳ đâu.

Không có tài liệu nào về định dạng nhị phân. Người ta cần đào sâu vào các nguồn .NET Framework để hiểu nó. Không vui chút nào.

Q2: Có trường hợp như vậy khi không thể khôi phục định nghĩa lớp học từ dữ liệu được tuần tự hóa không?

Dường như định dạng nhị phân chứa đủ dữ liệu. Nếu bạn hoàn toàn cần một công cụ để đảo ngược các lớp gốc ban đầu và các trường của chúng từ các tệp được tuần tự hóa, bạn có thể bắt đầu với các nguồn đọc là System.Runtime.Serialization.Formatters.Binary.BinaryFormatter, System.Runtime.Serialization.Formatters.Binary.ObjectReader và các lớp khác từ mscorlib.

Tuy nhiên, nếu ứng dụng đã tạo tệp không bị che khuất, tôi khuyên bạn nên thử dịch ngược nó trước. Nó có thể sẽ dễ dàng hơn nhiều.

P.S. Đừng quên hỏi ý kiến ​​luật sư của bạn.

+0

#Athari Ý bạn là gì bởi "Đừng quên hỏi ý kiến ​​luật sư của bạn." ? : P –

+1

@Casual Decompiling phần mềm bạn không sở hữu là bất hợp pháp ở nhiều quốc gia. Và bằng cách sở hữu phần mềm thương mại tôi có nghĩa là sở hữu thực tế, không mua một bản sao để sử dụng, như nhiều EULAs không cho phép giải mã. Có một số quốc gia, bao gồm Úc và Nga, luôn cho phép giải mã cho các mục đích cụ thể, ghi đè tất cả EULA. Tôi không chắc chắn về các định dạng tệp và kỹ thuật ngược lại. Nhìn chung, nếu bạn không chắc chắn, bạn nên hỏi ý kiến ​​luật sư. P.S. Đó là "@", không phải "#". Và thông báo về nhận xét luôn được gửi tới các tác giả của câu hỏi và câu trả lời. – Athari

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