如何在Java Hashtable中存储并检索Matlab结构体(无需额外工具箱)
解决方案:无需额外工具箱实现Matlab结构体存入Java哈希表
以下是三种不需要额外工具箱的可行方案,按简便程度排序:
方案1:JSON序列化(最简便,适用于R2016b+)
利用Matlab内置的jsonencode和jsondecode函数,将结构体转为JSON字符串存入Hashtable,还原时再解码。优点是代码简洁、可读性强,支持绝大多数常用数据类型(数字、字符串、数组、嵌套结构体)。
% 初始化Java Hashtable和Matlab结构体 h = java.util.Hashtable; mystruct = struct('a', 1, 'b', 'test', 'c', struct('d', [1 2 3])); % 存入:结构体转JSON字符串后放入Hashtable json_str = jsonencode(mystruct); h.put('foo', json_str); % 取出还原:从Hashtable获取字符串,解码为结构体 retrieved_json = char(h.get('foo')); retrieved_struct = jsondecode(retrieved_json);
注意:复数、函数句柄、自定义对象等JSON不支持的类型无法用此方法,需用其他方案。
方案2:二进制序列化(支持所有Matlab数据类型)
通过save将结构体写入临时文件,读取文件内容为二进制字符串存入Hashtable;还原时反向操作。此方法能处理任意复杂度的结构体,包括嵌套、特殊数据类型。
% 结构体转二进制字符串 function str = struct2bin(s) temp_file = tempname; save(temp_file, '-struct', 's'); fid = fopen(temp_file, 'rb'); str = fread(fid, '*char')'; fclose(fid); delete(temp_file); end % 二进制字符串转结构体 function s = bin2struct(str) temp_file = tempname; fid = fopen(temp_file, 'wb'); fwrite(fid, str, 'char'); fclose(fid); s = load(temp_file, '-struct'); delete(temp_file); end % 实际使用 h = java.util.Hashtable; mystruct = struct('a', 1+2i, 'b', @sin, 'c', struct('d', {1, 'test'})); % 存入 bin_str = struct2bin(mystruct); h.put('foo', bin_str); % 取出还原 retrieved_bin = char(h.get('foo')); retrieved_struct = bin2struct(retrieved_bin);
方案3:转换为Java哈希表(适合Java侧直接访问)
递归将Matlab结构体转换为java.util.HashMap(比Hashtable更轻量,若需线程安全可改用Hashtable),存入目标Hashtable。还原时再将Java哈希表转回Matlab结构体。
% Matlab结构体转Java HashMap function j_map = struct2javamap(s) j_map = java.util.HashMap; fields = fieldnames(s); for i = 1:length(fields) field_name = fields{i}; field_val = s.(field_name); if isstruct(field_val) % 嵌套结构体递归转换 j_map.put(field_name, struct2javamap(field_val)); elseif iscell(field_val) % Cell数组转Java ArrayList j_list = java.util.ArrayList; for j = 1:length(field_val) elem = field_val{j}; j_list.add(isstruct(elem) ? struct2javamap(elem) : elem); end j_map.put(field_name, j_list); else % 基本数据类型直接存入 j_map.put(field_name, field_val); end end end % Java HashMap转Matlab结构体 function s = javamap2struct(j_map) s = struct(); keys = j_map.keySet().toArray(); for i = 1:length(keys) key = char(keys(i)); val = j_map.get(key); if isa(val, 'java.util.HashMap') s.(key) = javamap2struct(val); elseif isa(val, 'java.util.ArrayList') cell_arr = cell(val.size(), 1); for j = 0:val.size()-1 elem = val.get(j); cell_arr{j+1} = isa(elem, 'java.util.HashMap') ? javamap2struct(elem) : elem; end s.(key) = cell_arr; else s.(key) = val; end end end % 实际使用 h = java.util.Hashtable; mystruct = struct('a', 1, 'b', [2 3 4], 'c', struct('d', {'x', 5})); % 存入 j_map = struct2javamap(mystruct); h.put('foo', j_map); % 取出还原 retrieved_map = h.get('foo'); retrieved_struct = javamap2struct(retrieved_map);
内容的提问来源于stack exchange,提问作者Robert Dodier
相关产品推荐
相关产品推荐

