2012-11-06 13 views
8

में एक तिथि एवरो का उपयोग कर क्रमानुसार करने मैं वास्तव में एवरो के साथ तारीखों युक्त वस्तुओं को क्रमानुसार करने कोशिश कर रहा हूँ, और deserialized तारीख उम्मीद मूल्य (एवरो 1.7.2 और 1.7.1 के साथ परीक्षण) से मेल नहीं खाता।कैसे जावा

import java.text.SimpleDateFormat; 
import java.util.Date; 

public class Dummy { 
    private Date date; 
    private SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss.SSS"); 

    public Dummy() { 
    } 

    public void setDate(Date date) { 
     this.date = date; 
    } 

    public Date getDate() { 
     return date; 
    } 

    @Override 
    public String toString() { 
     return df.format(date); 
    } 
} 

क्रमानुसार करने/deserialize इस्तेमाल किया कोड:

import java.io.ByteArrayOutputStream; 
import java.io.IOException; 
import java.util.Date; 

import org.apache.avro.Schema; 
import org.apache.avro.io.DatumReader; 
import org.apache.avro.io.DatumWriter; 
import org.apache.avro.io.Decoder; 
import org.apache.avro.io.DecoderFactory; 
import org.apache.avro.io.Encoder; 
import org.apache.avro.io.EncoderFactory; 
import org.apache.avro.reflect.ReflectData; 
import org.apache.avro.reflect.ReflectDatumReader; 
import org.apache.avro.reflect.ReflectDatumWriter; 

public class AvroSerialization { 

    public static void main(String[] args) { 
     Dummy expected = new Dummy(); 
     expected.setDate(new Date()); 
     System.out.println("EXPECTED: " + expected); 
     Schema schema = ReflectData.get().getSchema(Dummy.class); 
     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     Encoder encoder = EncoderFactory.get().binaryEncoder(baos, null); 
     DatumWriter<Dummy> writer = new ReflectDatumWriter<Dummy>(schema); 
     try { 
      writer.write(expected, encoder); 
      encoder.flush(); 
      Decoder decoder = DecoderFactory.get().binaryDecoder(baos.toByteArray(), null); 
      DatumReader<Dummy> reader = new ReflectDatumReader<Dummy>(schema); 
      Dummy actual = reader.read(null, decoder); 
      System.out.println("ACTUAL: " + actual); 
     } catch (IOException e) { 
      System.err.println("IOException: " + e.getMessage()); 
     } 
    } 
} 

और उत्पादन: यहाँ वर्ग मैं serializing हूँ

EXPECTED: 06/11/2012 05:43:29.188 
ACTUAL: 06/11/2012 05:43:29.387 

यह एक ज्ञात बग से संबंधित है, या क्या यह ऑब्जेक्ट को क्रमबद्ध करने के तरीके से संबंधित है?

+1

मुझे पता है कि मैं आपके प्रश्न का उत्तर नहीं दे रहा हूं, लेकिन मैं * एक स्थिर SimpleDateFormat का उपयोग नहीं करूंगा। यह थ्रेड-सुरक्षित वर्ग नहीं है और इसके परिणामस्वरूप आपको थ्रेडेड वातावरण में अविश्वसनीय परिणाम मिलेंगे –

+0

टिप्पणी के लिए धन्यवाद, यह वास्तव में एक उत्पादन कोड नहीं है, लेकिन मेरी समस्या का पर्दाफाश करने के लिए मैंने केवल एक टेस्ट क्लास विकसित की है। वैसे भी आप सही हैं, इसलिए मैंने स्थैतिक संशोधक को हटा दिया;) –

उत्तर

6

मुझे लगता है कि एवीआरओ इस बिंदु पर तारीख को क्रमबद्ध नहीं करता है। मैं इसे एक और कक्षा में लपेटना और लंबी (date.gettime()) के रूप में स्टोर करना चाहता हूं, जबकि एवरो फोल्क्स this feature जोड़ें। और जिस कारण से आप अलग-अलग दिनांक मान देखते हैं वह यह है कि हर बार जब आप (और avro) एक दिनांक ऑब्जेक्ट बनाते हैं, तो यह वर्तमान सिस्टम समय के साथ दिनांक आरंभ करता है।

+0

धन्यवाद, धन्यवाद, ऐसा लगता है कि तिथि वास्तव में आपके उत्तर में बताई गई नहीं है, और तिथि वास्तव में वर्तमान सिस्टम समय के साथ शुरू की गई है। –

7

एवरो 1.8 में अब एक तारीख "लॉजिकल टाइप" है, जो int को एनोटेट करती है। उदाहरण के लिए:

{ "नाम": "तिथि", "type": "पूर्णांक", "logicalType": "तिथि"}

कल्पना का हवाला देते हुए: "एक तारीख तार्किक प्रकार एक एवरो पूर्णांक annotates, जहां इंटिक्स यूनिक्स युग, 1 जनवरी 1 9 70 (आईएसओ कैलेंडर) से दिनों की संख्या संग्रहित करता है। "