java 对象 反序列化_从Blob反序列化Java对象

这是oracle 11g Java存储函数的示例,该函数从blob反序列化Java对象.作为免费赠品,添加了一个oracle java存储过程示例,以使用序列化的java对象更新blob.

如果对象的类不是Java内置的(如我的情况),则还需要在Oracle数据库中将它的源(带有所有依赖项)设置为publish.

CREATE OR REPLACE JAVA SOURCE NAMED "ServiceParamsBLOBHandler" AS

import java.io.*;

import java.util.*;

public class ServiceParamsBLOBHandler {

private static Object deserialize(InputStream stream) throws Exception {

ObjectInputStream ois = new ObjectInputStream(stream);

try {

return ois.readObject();

} finally {

ois.close();

}

}

private static byte[] serialize(Object object) throws IOException {

ByteArrayOutputStream baos = new ByteArrayOutputStream();

ObjectOutputStream oos = new ObjectOutputStream(baos);

oos.writeObject(object);

oos.close();

return baos.toByteArray();

}

//@SuppressWarnings("unchecked")

private static List> getParams(oracle.sql.BLOB blob) throws Exception {

return (List>) deserialize(blob.getBinaryStream());

}

public static oracle.sql.BLOB updatedParamField(oracle.sql.BLOB blob, String paramName, String fieldName, String value)

throws Exception {

List> params = getParams(blob);

Map param = getParam(params, paramName);

param.put(fieldName, value);

oracle.sql.BLOB res = oracle.sql.BLOB.createTemporary(blob.getOracleConnection(), true, oracle.sql.BLOB.DURATION_CALL);

res.setBytes(1, serialize(params));

return res;

}

public static void updateParamField(oracle.sql.BLOB[] blobs, String paramName, String fieldName, String value)

throws Exception {

oracle.sql.BLOB blob = blobs[0];

List> params = getParams(blob);

Map param = getParam(params, paramName);

param.put(fieldName, value);

blob.truncate(0);

blob.setBytes(1, serialize(params));

}

private static Map getParam(List> params, String name) {

for (Map param : params) {

if (name.equals(param.get("name"))) {

return param;

}

}

return null;

}

public static String getParamField(oracle.sql.BLOB blob, String paramName, String fieldName) throws Exception {

Map param = getParam(getParams(blob), paramName);

return param == null ? null : param.get(fieldName);

}

}

/

alter java source "ServiceParamsBLOBHandler" compile

--select * from SYS.USER_ERRORS

/

CREATE OR REPLACE function getServiceParamField(b IN BLOB, paramName IN VARCHAR2, fieldName IN VARCHAR2) RETURN VARCHAR2

as LANGUAGE JAVA NAME 'ServiceParamsBLOBHandler.getParamField(oracle.sql.BLOB, java.lang.String, java.lang.String) return String';

/

CREATE OR REPLACE function updatedServiceParamField(b IN BLOB, paramName IN VARCHAR2, fieldName IN VARCHAR2, value IN VARCHAR2) RETURN BLOB

as LANGUAGE JAVA NAME 'ServiceParamsBLOBHandler.updatedParamField(oracle.sql.BLOB, java.lang.String, java.lang.String, java.lang.String) return oracle.sql.BLOB';

/

CREATE OR REPLACE PROCEDURE updateServiceParamField(b IN OUT BLOB, paramName IN VARCHAR2, fieldName IN VARCHAR2, value IN VARCHAR2)

AS LANGUAGE JAVA NAME 'ServiceParamsBLOBHandler.updateParamField(oracle.sql.BLOB[], java.lang.String, java.lang.String, java.lang.String)';

/

-- oracle blob read usage example:

select getServiceParamField(byte_value, 'account', 'format') from entity_property where name='params';

-- oracle blob update with java stored function usage example:

update entity_property set byte_value=updatedServiceParamField(byte_value, 'account', 'format', '15')

where name='params' and entity_id = 123

-- oracle blob update with java stored procedure usage example:

BEGIN

FOR c IN (select byte_value from entity_property where name='params' and entity_id = 123 for update) LOOP

updateServiceParamField(c.byte_value, 'account', 'format', '13');

END LOOP;

END;

/

更新资料

有关案例的具体摘要.

1)满载

private static String getVariable(oracle.sql.BLOB blob, String name) throws Exception {

ObjectInputStream ois = new ObjectInputStream(blob.getBinaryStream());

try {

//noinspection unchecked

return ((HashMap) ((StorageBean) ois.readObject()).variables).get(name);

} finally {

ois.close();

}

}

2)局部磁场负荷

private static String getVariable(oracle.sql.BLOB blob, String name) throws Exception {

ObjectInputStream ois = new ObjectInputStream(blob.getBinaryStream());

try {

ois.skipBytes(variablesOffset);

//noinspection unchecked

return ((HashMap) ois.readObject()).get(name);

} finally {

ois.close();

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值