2013-12-11 4 views
-2

Когда я преобразовываю массив байтов в Inputstream, он дает исключение NotSerializableException. (См код ниже)Исключение NotSerializableException при преобразовании в InputStream

// return type of myBO.getAttachedFile() is byte[] 
InputStream inputStream = new ByteArrayInputStream(myBO.getAttachedFile()); 

Я проверил возвращение метода myBO.getAttachedFile(), и это сериализации. Поэтому моя проблема заключается в том, почему она не SERIALIZE после преобразования в InputStream, как написано в приведенном ниже коде. Возвращаемый тип myBO.getAttachedFile() iste []

Чтобы проверить сериализацию myBO.getAttachedFile(), я использовал приведенный ниже код. Это не дает Exception

try { 
     new ObjectOutputStream(new ByteArrayOutputStream()).writeObject(myBO.getAttachedFile()); 
    } catch (Exception e) { 
     logger.debug("========EXCEPTION====== Object Not Serialized"); 
     logger.debug(METHOD_NAME, e); 
    }  

Когда я проверяю сериализацию InputStream это дает исключение в коде ниже

try { 
     new ObjectOutputStream(new ByteArrayOutputStream()).writeObject(inputStream); 
    } catch (Exception e) { 
     logger.debug("========EXCEPTION====== Object Not Serialized"); 
     logger.debug(METHOD_NAME, e); 
    }  
+0

Код, который вы опубликовали, не может выбрасывать это исключение, если нет скрытой десериализации где-то, где вы не показывали нас. Исключением является «NotSerializableException», а не то, что он говорит в вашем названии. Точность пожалуйста. Сообщение об исключении, сообщении и трассировке стека. Часть о сериализации входных потоков не имеет смысла, но это не имеет значения. – EJP

+0

Вы отредактировали свой вопрос, но вы только обратились к незначительным вопросам. Вы не получите ответ без трассировки стека. – EJP

ответ

0

Вы пытаетесь написать целую InputStream экземпляр ObjectOutputStream, вместо содержимое фактического ресурса, на которое оно внутренне ссылается. Вы можете писать только экземпляры, которые реализуют Serializable interface, в противном случае вы получите довольно самоочевидный NotSerializableException.

InputStream class действительно не реализовать интерфейс Serializable. Экземпляр InputStream представляет собой просто указатель на открытый ресурс байта в базовой среде. В отличие от экземпляра byte[] экземпляр InputStream сам по себе не содержит данных, которые вы хотели бы сериализовать. Экземпляр InputStream является всего лишь «посланником» между фактическим байтовым ресурсом в базовой среде (например, указателем файловой системы диска) и кодом Java. Он способен считывать данные как byte/byte[] и возвращать его, но он сам по себе не хранит их нигде в экземпляре. Он не имеет private byte[] alldata собственности или около того.

Вы действительно не можете сериализовать такую ​​вещь. Ресурс будет просачиваться (поэтому, когда вы делаете это слишком часто за слишком короткое время, в вашей среде будет нехватка ресурсов), и указатель не обязательно будет действительным в данный момент, когда вы его десериализуете, точно не тогда, когда вы это сделаете это в совершенно другой среде.

Просто используйте byte[]. Или, может быть, лучше, забыть всю попытку сериализации. В зависимости от конкретного функционального требования это, скорее всего, не имеет никакого смысла для того, что вы пытаетесь достичь.

+0

Ничего из этого не имеет смысла. Исключения, которые не выбрасываются кодом, который опубликован; избыточное «доказательство», которое InputStream не является сериализуемым, что мы знали, и которое, похоже, не имеет никакого отношения к реальному вопросу; невозможность опубликовать реальное исключение или реальный код при его запросе. Это бессмысленно. – EJP

Смежные вопросы