Jodatime Xstream Local Отображение даты - PullRequest
3 голосов
/ 15 сентября 2011

Я использую xstrem для сериализации локальной даты в формате jodatime в xml. Однако при выводе сгенерированного xml LocalDate находится не в легко читаемом формате. Смотрите ниже:

<date>
    <iLocalMillis>1316563200000</iLocalMillis>
    <iChronology class="org.joda.time.chrono.ISOChronology" reference="../../tradeDate/iChronology"/>

Есть идеи, как заставить xstream отображать дату в формате, который меня не насторожит?

Ответы [ 5 ]

4 голосов
/ 21 августа 2012

Вот то, что я успешно использовал.Я полагаю, что использовал информацию по ссылке, указанной в первом посте.

import java.lang.reflect.Constructor;

import org.joda.time.DateTime;

import com.thoughtworks.xstream.converters.Converter;
import com.thoughtworks.xstream.converters.MarshallingContext;
import com.thoughtworks.xstream.converters.UnmarshallingContext;
import com.thoughtworks.xstream.io.HierarchicalStreamReader;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;


public final class JodaTimeConverter implements Converter {

    @Override
    @SuppressWarnings("unchecked")
    public boolean canConvert(final Class type) {
            return (type != null) && DateTime.class.getPackage().equals(type.getPackage());
    }

    @Override
    public void marshal(final Object source, final HierarchicalStreamWriter writer,
            final MarshallingContext context) {
            writer.setValue(source.toString());
    }

    @Override
    @SuppressWarnings("unchecked")
    public Object unmarshal(final HierarchicalStreamReader reader,
            final UnmarshallingContext context) {
            try {
                    final Class requiredType = context.getRequiredType();
                    final Constructor constructor = requiredType.getConstructor(Object.class);
                    return constructor.newInstance(reader.getValue());
            } catch (final Exception e) {
                throw new RuntimeException(String.format(
                 "Exception while deserializing a Joda Time object: %s", context.getRequiredType().getSimpleName()), e);
            }
    }

}

Вы можете зарегистрировать его как:

XStream xstream = new XStream(new StaxDriver());
xstream.registerConverter(new JodaTimeConverter());
3 голосов
/ 19 июня 2013

Версия от @Ben Carlson имеет проблему, если ваше дерево объектов содержит другие классы из того же пакета, что и DateTime.

Более надежная версия для преобразования DateTime в XML и обратно, которая также не требует отражения:

public static class JodaTimeConverter implements Converter
{
    @Override
    @SuppressWarnings("unchecked")
    public boolean canConvert( final Class type )
    {
        return DateTime.class.isAssignableFrom( type );
    }

    @Override
    public void marshal( Object source, HierarchicalStreamWriter writer, MarshallingContext context )
    {
        writer.setValue( source.toString() );
    }

    @Override
    @SuppressWarnings("unchecked")
    public Object unmarshal( HierarchicalStreamReader reader,
                             UnmarshallingContext context )
    {
        return new DateTime( reader.getValue() );
    }
}

Зарегистрируйте конвертер в XStream, чтобы использовать его:

XStream xstream = new XStream();
xstream.registerConverter(new JodaTimeConverter());
2 голосов
/ 29 июня 2013

Нам нужно было преобразовать Joda DateTime в / из атрибута XML. Для этого конвертерам необходимо реализовать интерфейс SingleValueConverter. Наша окончательная реализация:

package com.squins.xstream.joda;

import org.joda.time.DateTime;

import com.thoughtworks.xstream.converters.ConversionException;
import com.thoughtworks.xstream.converters.basic.AbstractSingleValueConverter;


public final class JodaDateTimeConverter extends AbstractSingleValueConverter
{

    @Override
    public boolean canConvert(final Class type)
    {
    return DateTime.class.equals(type);
    }

    @Override
    public Object fromString(String str)
    {
    try
    {
        return new DateTime(str);
    }
    catch (final Exception e)
    {
        throw new ConversionException("Cannot parse date " + str);
    }
    }
}
1 голос
/ 15 сентября 2011

Вы должны реализовать (или найти) специальный конвертер для xstream, который будет обрабатывать объект JodaTime так, как вы считаете нужным.

Вот небольшой пример такого конвертера: http://x -stream.github.io / converter-tutorial.html

0 голосов
/ 24 августа 2016

Я использовал тот, который здесь .Вставить это для простоты:

public class JodaTimeConverter implements Converter
{
    @Override
    public boolean canConvert(Class type) {
        return type != null && DateTime.class.getPackage().equals(type.getPackage());
    }

    @Override
    public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) {
        writer.setValue(source.toString());
    }

    @Override
    public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
        try {
            Constructor constructor = context.getRequiredType().getConstructor(Object.class);
            return constructor.newInstance(reader.getValue());
        } catch (Exception e) { // NOSONAR
            throw new SerializationException(String.format(
            "An exception occurred while deserializing a Joda Time object: %s",
            context.getRequiredType().getSimpleName()), e);
        }
    }
}

Другие образцы не работали.Ура! * * 1006

...