Хранение структур MATLAB в объектах Java

Я не верю, что есть нестандартное картографирование.

Вы можете добавить GenericConvertor в WebConversionService, который использует WebDataBinder. Вам нужно будет перечислить все ваши типы объектов. Примерно так:

import java.util.HashSet;
import java.util.Set;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.convert.TypeDescriptor;
import org.springframework.core.convert.converter.GenericConverter;
import org.springframework.stereotype.Component;

import com.fasterxml.jackson.databind.ObjectMapper;

@Component
public class JsonFieldConverter implements GenericConverter {

    @Autowired
    private ObjectMapper objectMapper;

    // Add a new ConvertiblePair for each type you want to convert json 
    // in a field to using the objectMapper. This example has Patient and Doctor
    private static Set<ConvertiblePair> convertibleTypes = new HashSet<>();
    static {
        convertibleTypes.add(new ConvertiblePair(String.class, Patient.class));
        convertibleTypes.add(new ConvertiblePair(String.class, Doctor.class));
    }

    @Override
    public Set<ConvertiblePair> getConvertibleTypes() {
        return convertibleTypes;
    }

    @Override
    public Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType) {
        try {
            return objectMapper.readValue(source.toString(), targetType.getType());
        } catch (Exception e) {
            // TODO deal with the error.
            return source;
        }

    }
}

И @ControllerAdvice, чтобы подключить его к подшивке данных:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.web.format.WebConversionService;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.InitBinder;

@ControllerAdvice
public class JsonFieldConfig {

    @Autowired
    private JsonFieldConverter jsonFieldConverter;

    @InitBinder
    private void bindMyCustomValidator(WebDataBinder binder) {
        ((WebConversionService)binder.getConversionService()).addConverter(jsonFieldConverter);
    }

}  
8
задан Dani 12 January 2009 в 20:18
поделиться

3 ответа

Необходимо удостовериться, что данные, переданные от MATLAB до Java, могут быть правильно преобразованы. См. Внешний документ Интерфейсов MATLAB для матрицы преобразования, которой типы преобразовываются в который другие типы.

MATLAB рассматривает большинство данных как передачу значением (за исключением классов с семантикой дескриптора) и там, кажется, не способ перенести структуру в интерфейс Java. Но Вы могли использовать другой HashMap, чтобы действовать как структура и преобразовать структуры MATLAB в HashMaps (с очевидным предупреждением для многоуровневых структур, указателей на функцию, + другие звери, которые не играют хорошо с процессом преобразования данных MATLAB/Java).

function hmap = struct2hashmap(S)
if ((~isstruct(S)) || (numel(S) ~= 1))
    error('struct2hashmap:invalid','%s',...
          'struct2hashmap only accepts single structures');
end

hmap = java.util.HashMap;
for fn = fieldnames(S)'
    % fn iterates through the field names of S
    % fn is a 1x1 cell array
    fn = fn{1};
    hmap.put(fn,getfield(S,fn));
end

случай возможного применения:

>> M = java.util.HashMap;
>> M.put(1,'a');
>> M.put(2,33);
>> s = struct('a',37,'b',4,'c','bingo')

s = 

    a: 37
    b: 4
    c: 'bingo'

>> M.put(3,struct2hashmap(s));
>> M

M =

{3.0={a=37.0, c=bingo, b=4.0}, 1.0=a, 2.0=33.0}

>>

(осуществление для читателя: измените это для работы рекурсивно на элементы структуры, которые сами являются структурами),

7
ответ дан 5 December 2019 в 13:02
поделиться

Я не знаком с Java HashMaps, но Вы могли попытаться использовать массив ячеек, чтобы хранить данные вместо структуры?

h = java.util.HashMap;
carr = {7, 'hello'};
h.put(7, carr);

% OR

h = java.util.HashMap;
st.val = 7;
h.put(7, struct2cell(st));
1
ответ дан 5 December 2019 в 13:02
поделиться

В Matlab R2008b и новее есть класс container.Map, который обеспечивает функциональность, подобную HashMap, для собственных типов данных Matlab, поэтому они будут работать со структурами, ячейками, определяемыми пользователем объектами Matlab и т.

% Must initialize with a dummy value to allow numeric keys
m = containers.Map(0, 0, 'uniformValues',false);
% Remove dummy entry
m.remove(0);

m(5) = 'test';
m(7) = magic(4);
m(9) = struct('foo',42, 'bar',1:3);
m(5), m(7), m(9) % get values back out
5
ответ дан 5 December 2019 в 13:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: