2013-08-14 18 views
6

Una settimana fa mi sono trovato in una situazione in cui dovevo leggere un oggetto serializzato binario creato da un'altra applicazione fatta da qualcun altro. Avevo solo il file someSerializedData.bin, quindi ho provato a ricreare manualmente la definizione della classe per l'oggetto sconosciuto e sono riuscito a farlo, a causa dei metadati nel file serializzato. Stranamente, non ho trovato nessuno strumento su google.Metadati di serializzazione binaria .NET

Q1: Perché non esiste uno strumento che ricrea la definizione della classe da un file/dati serializzati in formato binario?

e porta alla mia seconda domanda

Q2: C'è questo caso, quando è impossibile ripristinare la definizione di classe dai dati serializzati? (Supponendo che non sia crittografato o offuscato in alcun modo, mi interessano i casi che riguardano le proprietà "predefinite" .NET Binaryserializer, per disabilitare le informazioni sul tipo ei metadati inclusi)

+2

Si prega di non limitarsi a downvotare, dimmi cosa c'è che non va, quindi posso migliorare la domanda. –

+0

penso che quello che stai cercando si chiami riflesso (prendendo il codice macchina e lo si inverta in C#) ho ragione? – Liran

+1

Hai una copia dell'app che ha creato il file .bin? Se è così, puoi decompilarlo e osservare il codice. Vedi dotPeak: http://www.jetbrains.com/decompiler/ – dana

risposta

1

La ragione per cui nessuno strumento esiste è perché è spesso non è sufficiente per creare un tipo che contiene solo i dati. I metodi sono spesso importanti quanto i dati, specialmente con le proprietà che non impostano solo le loro variabili private. Nessuno sa quali siano questi metodi.

Con ciò detto, può essere utile avere uno strumento che sia almeno in grado di generare un tipo per contenere i dati. Forse sarai il primo a creare uno strumento del genere?

2

È impossibile deserializzare i dati binari senza sapere cosa c'è dentro. L'unico modo per farlo è serializzarlo usando JSON o XML per esempio. Un esempio per illustrare:

Il tuo nome "Casual" può essere serializzato in questo modo: 67,97,115,117,97,108. Nel caso non l'avessi notato: questo viene fatto usando la codifica ASCII (se non ho fatto errori). Quindi ora, immagina di non sapere che questo è fatto con ASCII, chi dice che questo non è solo un array con i numeri? O 3 matrici di 2 numeri? O un oggetto con ID 67 e un oggetto con ID 117. Nessuno lo sa, quindi il tuo compito è impossibile.

L'unica opzione è comunicare con la persona che lo ha serializzato in origine e gli chiede come questo è fatto e quali oggetti sono serializzati in questo oggetto binario.

Cordiali saluti

+1

Stiamo parlando di serializzazione binaria .NET, serializzazione non personalizzata. La mia domanda non era quella se posso o non posso deserializzare un oggetto sconosciuto. (btw è possibile a causa dei metadati inclusi -> domande/17996701/deserializzazione binaria-senza-definizione-oggetto) La mia domanda era se è possibile serializzare con il Binaryformatter (non personalizzato!) senza tanti metadati, che sarebbe di aiuto chiunque per ripristinare la definizione di classe originale dell'oggetto. Grazie per la risposta comunque :) –

+0

@Casual * La mia domanda era se è possibile serializzare con il Binaryformatter (non personalizzato!) Senza tanti metadati, che aiuterebbe chiunque a ripristinare la definizione di classe originale dell'oggetto *, ** No ** la tua domanda non è questa ... Non è uguale a * Esiste un caso in cui è impossibile ripristinare la definizione della classe dai dati serializzati? * –

1

Non sono sicuro che ci siano informazioni sufficienti nei metadati per ricreare il tipo. Immagina grafici di oggetti complessi (come nidificati). Nella tua domanda precedente, i tipi di membri (String vs int) sono stati un problema.

Per quanto riguarda la seconda domanda, non sono sicuro di ciò che si tenta di ottenere. Non sono sicuro che sia possibile utilizzare BinaryFormatter per l'output dei dati in un modo che non è troppo semplice da decodificare, ma altri metodi dovrebbero essere semplici da implementare.

+1

string vs int era solo un problema perché ha fatto un'ipotesi su i tipi invece di leggere i dati binari effettivi. – Will

2

Q1: Perché non esiste uno strumento che ricrea la definizione della classe da un file/dati serializzati in formato binario?

La mia ipotesi è che pochissime persone abbiano bisogno di questo. Per cominciare, la serializzazione binaria non è popolare come XML, JSON e altri formati che sono standardizzati e supportati praticamente ovunque.

Non c'è documentazione sul formato binario. Uno deve scavare in fonti di .NET Framework per capirlo. Non è divertente.

Q2: Esiste un caso in cui è impossibile ripristinare la definizione di classe dai dati serializzati?

Sembra che il formato binario contenga abbastanza dati. Se è assolutamente necessario uno strumento per decodificare le classi originali e i relativi campi dai file serializzati, è possibile iniziare leggendo le fonti di System.Runtime.Serialization.Formatters.Binary.BinaryFormatter, System.Runtime.Serialization.Formatters.Binary.ObjectReader e altre classi da mscorlib.

Tuttavia, se l'applicazione che ha prodotto i file non è offuscata, suggerisco di provare a decompilarla per prima. Sarà probabilmente molto più facile.

P.S. Non dimenticare di consultare il tuo avvocato.

+0

#Athari Cosa intendi con "Non dimenticare di consultare il tuo avvocato". ? : P –

+1

@Casual Il software di decompilazione che non si possiede è illegale in molti paesi. E con il possesso di software commerciale intendo il possesso effettivo, non avendo acquistato una copia per l'uso, dato che molti EULA non consentono la decompilazione. Ci sono alcuni paesi, tra cui Australia e Russia, che consentono sempre la decompilazione per scopi specifici, ignorando tutti gli EULA. Non sono sicuro dei formati e dei protocolli di file di reverse engineering. Nel complesso, se non sei sicuro, è una buona idea consultare un avvocato. Post scriptum Non è "#". E le notifiche sui commenti vengono sempre inviate agli autori delle domande e delle risposte. – Athari

Problemi correlati