Serializzazione: l'output di un serializzatore può essere modificato e quindi de-serializzato

0

Sto provando a serializzare un oggetto Message usando ObjectOutputStream, prendere l'output byte [] del serializzatore, crittografarlo usando uno strumento di crittografia e quindi provare a decalervarlo e lanciarlo come oggetto. Fornisce un errore - intestazione del flusso non valida. Non è possibile modificare OutputStream dopo la serializzazione e quindi deserializzarlo? Scusami se sto facendo qualcosa di atroce, sono un novizio di Java. Codice per serializzatore - serialMsg ():

ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(bos);
out.writeObject(this);
bytes = bos.toByteArray();
out.close();

L'output del serializzatore viene quindi utilizzato come di seguito:

byte[] data = this.serialMsg(); // This is where I serialize the Message object
byte[] out = util.Encrypt(data, fromsk , to.toString(), param); // This is where I encrypt the byte[ ] - data and obtain an encrypted byte [ ] - out

L'oggetto viene quindi de-serializzato come:

ByteArrayInputStream in = new ByteArrayInputStream(out);
ObjectInputStream objin = new ObjectInputStream(in) ;
msg = (Message)objin.readObject(); // This is where I cast the output of readObject into the type Message - the original type of the object that was serialized.

Spero che l'obiettivo dietro questo sia chiaro. Sto provando a modificare il flusso di output e poi provando a reinserirlo nel tipo originale.

    
posta Hashtag 14.04.2015 - 09:49
fonte

1 risposta

0

L'API di serializzazione fa una promessa specifica: se salvi i byte creati da una chiamata serialize() , puoi in seguito inviarli a una chiamata di deserialize() e il tuo oggetto verrà ricostruito. Questo è tutto ciò che fa.

Stai facendo qualcosa di diverso: stai alimentando un flusso di dati diverso al deserializzatore. Non è nella sua descrizione del lavoro, quindi non sorprende che fallisce. Non importa che il nuovo flusso di dati sia intimamente legato a quello originale; tutto ciò che conta è che non è lo stesso .

Per ottenere ciò che desideri, dovresti capire come funziona il processo di serializzazione e personalizzare la tua trasformazione in modo che l'operazione inversa abbia successo. Ciò è tecnicamente possibile, ma vorrebbe dire che in pratica devi fare tutto il lavoro che la biblioteca dovrebbe fare per te. A quel punto, non è più necessario utilizzarlo affatto e si sta utilizzando un meccanismo diverso che serializza e crittografa i dati nel modo desiderato.

Fortunatamente, ci sono sono soluzioni che fanno entrambe le cose. Vedi link per un esempio di un precedente domanda su requisiti simili.

    
risposta data 14.04.2015 - 10:09
fonte

Leggi altre domande sui tag