Как написать XStream конвертер, который пишет и читает через преобразование в промежуточный объект? - PullRequest
0 голосов
/ 15 февраля 2012

У меня есть класс MyClass. Если я сериализую его без реализации пользовательского конвертера, он станет нечитаемым для человека.

Я реализовал MyClassDTO и преобразование между MyClass и MyClassDTO.

MyClassDTO читается человеком при использовании стандартной сериализации XStream.

Я хочу написать сериализацию и десериализацию XStream Converter MyClass.
Реализация для Converter.marshal должна быть следующей: преобразовать объект MyClass в MyClassDTO one и вызвать сериализацию по умолчанию для MyClassDTO.

А для Converter.unmarshal: вызвать десериализацию по умолчанию для объекта MyClassDTO и преобразовать его в MyClass.

Как реализовать такое поведение простым способом?

Я просмотрел Руководство по XStream Converter , но не нашел то, что мне нужно.

Мне нужно заполнить заглушки ниже:

class MatrixConverter<T> : Converter
    where T : new()
{
    public bool CanConvert(Type type)
    {
        return type == typeof(Matrix<T>);
    }

    public void ToXml(object value, Type expectedType, XStreamWriter writer, MarshallingContext context)
    {
        Matrix<T> matrix = value as Matrix<T>;
        if (matrix == null)
        {
            throw new ArgumentException();
        }
        // the code which I am asked about should follow here
    }

    public object FromXml(Type expectedType, XStreamReader reader, UnmarshallingContext context)
    {
        Matrix<T> matrix = null;

        // the code which I am asked about should follow here

    }
}

1 Ответ

1 голос
/ 23 февраля 2012

Попробуйте, если

MatrixDTO m = new MatrixDTO( matrix );

преобразует тип внутренней матрицы в DTO.

public void ToXml(object value, Type expectedType, 
    XStreamWriter writer, MarshallingContext context)
{
    context.convertAnother(new MatrixDTO( matrix ));
}

public Object FromXml(Type expectedType, 
    XStreamReader reader, UnmarshallingContext context)
{
    return context.convertAnother(context.currentObject(), MatrixDTO.class);
}

В случае демаршаллинга вам, возможно, придется вставить его вручную в context.currentObject (). Сам не пробовал.

Надеюсь, это поможет.

...