我可以将java序列化对象DeSerialize到不同的类吗?

时间:2016-09-13 12:13:30

标签: java json caching serialization jackson

不确定如何构建问题。这是一个尝试:

我有两个airospike缓存(套)说X,Y。

jar有两个版本,每个版本都有一个com.xyz.MyClass类

jar1:

com.xyz.MyClass{
    com.abc.Request request;
    ...
}

jar2:

com.xyz.MyClass{
    com.pqr.Request request;
    ...
}

现在来自jar1的MyClass的一些对象存储在缓存X和 jar2中MyClass的一些对象存储在缓存Y中。

我想从两个缓存中反序列化数据,执行一些计算并存储在数据库中。

我无法序列化,因为两个罐子中MyClass的完全限定名称是相同的。

我将删除其中一个缓存(但这需要一些时间)。 因此,希望暂时解决此问题。

我能以一种很好的方式处理这个问题吗?

也许反序列化为中间件(不关心包,但只关心类结构)然后反转到MyClass。

注意:两个类都具有相同的结构,只是成员变量的包名称不同。

P.S。 :不想使用多个类加载器。

2 个答案:

答案 0 :(得分:0)

实现它需要大量的魔力,并且不允许使用类加载器魔法删除一半的选项。

我建议的解决方案是编辑序列化数据。对象序列化的格式是已知的,并且是Java规范的一部分。因此,您可以编辑此字节以将一个类名替换为另一个,但我建议您在开始实现此之前再三考虑。这可能不是那么简单的任务。

答案 1 :(得分:-1)

生成两个不同的 serialVersionUID&#39> 并在每个类中使用它们。

Create Table #tblData (Id int, UniqueKey VARCHAR(10), DateTimeNow DATETIME, UpdateBy VARCHAR(10))
insert into #tblData values (1, 'uq1', getdate(), 'abc'), (2, 'uq2', getdate()+1, 'xyz')
--select * from #tblData
   create Table #tblMaster (MasterId INT IDENTITY(100,1), DateTimeNow DATETIME, UpdateBy VARCHAR(10))
create Table #tblChild (ChildId INT IDENTITY(10,1), MasterId INT, UniqueKey VARCHAR(10), DateTimeNow DATETIME)

declare @id int
DECLARE @MyCursor CURSOR
SET @MyCursor = CURSOR FAST_FORWARD FOR
SELECT Id FROM  #tblData 
OPEN @MyCursor
FETCH NEXT FROM @MyCursor INTO @id
WHILE @@FETCH_STATUS = 0
BEGIN
declare @UniqueKey VARCHAR(10) declare @DateTimeNow datetime
declare @iIdentity int
create table #OutputTbl (Id Int, UniqueKey VARCHAR(10),  DateTimeNow DATETIME)

select @UniqueKey = UniqueKey, @DateTimeNow = DateTimeNow from #tblData where Id = @id

INSERT INTO #tblMaster(DateTimeNow, UpdateBy) SELECT DateTimeNow, UpdateBy FROM #tblData where Id = @id
SELECT @iIdentity=SCOPE_IDENTITY()

INSERT INTO #OutputTbl values (@iIdentity, @UniqueKey, @DateTimeNow)
select * from #OutputTbl
drop table #OutputTbl

FETCH NEXT FROM @MyCursor INTO @id
END
CLOSE @MyCursor
DEALLOCATE @MyCursor

drop table #tblChild
drop table #tblMaster
drop table #tblData

您可以使用 Eclipse IDE JDK的serialver工具生成您自己的serialVersionUID。

注意:如果没有声明serialVersionUID,JVM将使用自己的算法生成默认的SerialVersionUID。 你可以查看算法here.

默认的serialVersionUID计算对类详细信息非常敏感,可能因不同的JVM实现而异,并且在反序列化过程中会导致意外的InvalidClassExceptions。