2015-05-12 48 views
0

以下是一些在一臺機器上運行但在另一臺機器上失敗並出現異常的Avro代碼。Avro寫入和讀取在一臺機器上工作,而不是在其他機器上工作

我們無法確定這裏有什麼問題。

這是導致問題的代碼。

Class<?> clazz = obj.getClass(); 
ReflectData rdata = ReflectData.AllowNull.get(); 
Schema schema = rdata.getSchema(clazz); 

ByteArrayOutputStream os = new ByteArrayOutputStream(); 
Encoder encoder = EncoderFactory.get().binaryEncoder(os, null); 
DatumWriter<T> writer = new ReflectDatumWriter<T>(schema, rdata); 
writer.write(obj, encoder); 
encoder.flush(); 
byte[] bytes = os.toByteArray(); 

String binaryString = new String (bytes, "ISO-8859-1"); 
BinaryDecoder decoder = DecoderFactory.get().binaryDecoder(binaryString.getBytes("ISO-8859-1"), null); 
GenericDatumReader<GenericRecord> datumReader = new GenericDatumReader<GenericRecord> (schema); 
GenericRecord record = datumReader.read(null, decoder); 

的例外是:

org.apache.avro.AvroRuntimeException: Malformed data. Length is negative: -32 
at org.apache.avro.io.BinaryDecoder.doReadBytes(BinaryDecoder.java:336) 
at org.apache.avro.io.BinaryDecoder.readString(BinaryDecoder.java:263) 
at org.apache.avro.io.ValidatingDecoder.readString(ValidatingDecoder.java:107) 
at org.apache.avro.generic.GenericDatumReader.readString(GenericDatumReader.java:437) 
at org.apache.avro.generic.GenericDatumReader.readString(GenericDatumReader.java:427) 
at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:189) 
at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:187) 
at org.apache.avro.generic.GenericDatumReader.readField(GenericDatumReader.java:263) 
at org.apache.avro.generic.GenericDatumReader.readRecord(GenericDatumReader.java:216) 
at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:183) 
at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:173) 
+0

請發佈包含堆棧跟蹤的異常 –

+0

@KristofferE,我添加了異常 – user2250246

回答

1

添加指定-Dfile.encoding = UTF-8在tomcat PARAMS幫助我們解決這個問題。

+0

對於明確使用ISO-8859-1,我會保持謹慎。我相信Avro將字符串編寫爲UTF-8字節,而8859-1完全不符合UTF-8。您可能會遇到破壞您的代碼的字符,因爲您在返回字節之前將字節解釋爲8859-1,這可能會破壞數據。 – Keegan

+0

ISO-8859-1用於在以下代碼中無法通過UTF-8字節到字符串轉換處理的數字的二進制編碼: new String(os.toByteArray(),「ISO-8859-1」);你看到這個轉換的問題嗎? – user2250246

+0

我將不得不再次挖掘Avro來仔細檢查它與它編寫的編碼。如果它不是8859-1,這將是一個問題。爲什麼你首先將它轉換爲字符串? – Keegan

相關問題