首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java微流.合成类. PersistenceExceptionTypeNotPersistable

Java微流.合成类. PersistenceExceptionTypeNotPersistable
EN

Stack Overflow用户
提问于 2020-08-05 13:41:01
回答 2查看 124关注 0票数 0

使用微流获取下面的异常。由引用静态内部类的类引起的。我如何解决这个问题?

异常声明如下,但文档没有解释如何实现PersistenceTypeResolver

详细信息:合成类(1美元等)不是可靠的持久性,因为简单地重新排序源代码元素会更改类的名称标识。对于必须依赖于根据类型的标识名解析类型的类型系统,这将悄悄地导致潜在的致命错误。如果处理合成类(例如匿名内部类)是绝对必要的,则可以使用自定义one.microstream.persistence.types.PersistenceTypeResolver来删除异常并承担正确处理合成类名的全部责任。在one.microstream.persistence.types.Persistence.derivePersistentTypeName(Persistence.java:1083)

代码语言:javascript
复制
    public static final AbstractAccompanyingPassenger DUMMY = new AbstractAccompanyingPassenger(MetaDataAccompanyingType.DUMMY) {
        @Override
        public AbstractAccompanyingPassenger clone() {
            return DUMMY;
        }};
代码语言:javascript
复制
Caused by: one.microstream.persistence.exceptions.PersistenceExceptionTypeNotPersistable: Type not persistable: "class net.atpco.metadata.summary.accompanied.MetaDataAccompanying$1". Details: Synthetic classes ($1 etc.) are not reliably persistence since a simple reordering of source code elements would change the name identity of a class. For a type system that has to rely upon resolving types by their identifying name, this would silently cause a potentially fatal error. If handling synthetic classes (e.g. anonymous inner classes) is absolutely necessary, a custom one.microstream.persistence.types.PersistenceTypeResolver can be used to remove the exception and assume  complete responsibility for correctly handling synthetic class names.
    at one.microstream.persistence.types.Persistence.derivePersistentTypeName(Persistence.java:1083)
    at one.microstream.persistence.types.PersistenceTypeResolver.deriveTypeName(PersistenceTypeResolver.java:17)
    at one.microstream.persistence.types.PersistenceTypeHandlerCreator$Abstract.deriveTypeName(PersistenceTypeHandlerCreator.java:73)
    at one.microstream.persistence.binary.types.BinaryTypeHandlerCreator$Default.internalCreateTypeHandlerGeneric(BinaryTypeHandlerCreator.java:238)
    at one.microstream.persistence.types.PersistenceTypeHandlerCreator$Abstract.createTypeHandlerGeneric(PersistenceTypeHandlerCreator.java:168)
    at one.microstream.persistence.types.PersistenceTypeHandlerEnsurer$Default.ensureTypeHandler(PersistenceTypeHandlerEnsurer.java:199)
    at one.microstream.persistence.internal.PersistenceTypeHandlerProviderCreating.ensureTypeHandler(PersistenceTypeHandlerProviderCreating.java:170)
    at one.microstream.persistence.internal.PersistenceTypeHandlerProviderCreating.provideTypeHandler(PersistenceTypeHandlerProviderCreating.java:78)
    at one.microstream.persistence.types.PersistenceTypeHandlerManager$Default.internalEnsureTypeHandler(PersistenceTypeHandlerManager.java:587)
    at one.microstream.persistence.types.PersistenceTypeHandlerManager$Default.ensureTypeHandler(PersistenceTypeHandlerManager.java:357)
    at one.microstream.persistence.types.PersistenceTypeHandlerManager$Default.ensureTypeHandler(PersistenceTypeHandlerManager.java:333)
    at one.microstream.persistence.binary.types.BinaryStorer$Default.registerGuaranteed(BinaryStorer.java:557)
    at one.microstream.persistence.binary.types.BinaryStorer$Default.registerLazyOptional(BinaryStorer.java:572)
    at one.microstream.persistence.types.PersistenceObjectManager$Default.ensureObjectId(PersistenceObjectManager.java:182)
    at one.microstream.persistence.binary.types.BinaryStorer$Default.register(BinaryStorer.java:591)
    at one.microstream.persistence.binary.types.BinaryStorer$Default.apply(BinaryStorer.java:298)
    at one.microstream.persistence.binary.types.BinaryValueFunctions$9.storeValueFromMemory(BinaryValueFunctions.java:147)
    at one.microstream.persistence.binary.types.Binary.storeFixedSize(Binary.java:1149)
    at one.microstream.persistence.binary.internal.AbstractBinaryHandlerReflective.store(AbstractBinaryHandlerReflective.java:497)
    at one.microstream.persistence.binary.internal.AbstractBinaryHandlerReflective.store(AbstractBinaryHandlerReflective.java:1)
    at one.microstream.persistence.binary.types.BinaryStorer$Default.storeItem(BinaryStorer.java:414)
    at one.microstream.persistence.binary.types.BinaryStorer$Default.storeGraph(BinaryStorer.java:403)
    at one.microstream.persistence.binary.types.BinaryStorer$Default.store(BinaryStorer.java:421)
    at one.microstream.persistence.types.PersistenceManager$Default.store(PersistenceManager.java:274)
    at one.microstream.storage.types.StorageConnection.store(StorageConnection.java:306)
    at one.microstream.cache.CacheStore$Default.write(CacheStore.java:112)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-08-07 15:15:04

我已经找到了这个问题的解决方案,而不需要改变Java对象图结构,并且有合成类/静态引用。

为具有合成类/静态reference

  • Override、存储method

  • Override、创建method

  • Override initializeState方法

的对象实现CustomBinaryHandler

商店

如果引用指向合成类/静态引用,则创建对象的新实例,并将引用设置为“标记”。在我的情况下是空的。不要更新传递给存储方法的当前对象,确保创建克隆并修改适用的引用。然后调用super.store()

创建

创建对象的空实例

initializeState

如果所讨论的值具有“标记”,则reference

  • Create

  • 检索对象

  • 的值,然后将其设置为合成类/静态

  • (克隆对象),并从克隆到实际实例

填充values

  • XReflect.copyFields

代码语言:javascript
复制
public class ExampleTypeHandler extends CustomBinaryHandler<Example> {

    private static Class<Example> handledType() {
        return Example.class; // to get ".class" to work
    }
    
    //the fields to be persisted
    BinaryField<Example> accompanying = Field(Object.class, Example::getAccompanying);
    BinaryField<Example> resulting = Field(Object.class, Example::getResulting);
    
    public ExampleTypeHandler()
    {
        super(handledType());
    }
    
    @Override
    public void store(Binary data, Example dtl, long objectId, PersistenceStoreHandler<Binary> handler) {
        if (dtl.getAccompanying() == MetaDataAccompanying.DUMMY) {
            dtl = Example.of(dtl.getResulting(), null);
        }
        super.store(data, dtl, objectId, handler);
    }
    
    @Override
    public Example create(final Binary data, final PersistenceLoadHandler handler) {
        return Example.of(null, null);
    }

    @Override
    public void initializeState(final Binary data, final Example instance, final PersistenceLoadHandler handler) {
        //get the referenced Objects
        Object accompanying = this.accompanying.readReference(data, handler);
        String r = (String)this.resulting.readReference(data, handler);
            
        if (accompanying == null) {
            accompanying = MetaDataAccompanying.DUMMY;
        }

        MetaDataAccompanying a = (MetaDataAccompanying) accompanying;
        Example dtl = Example.of(r, a);
        
        XReflect.copyFields(dtl, instance);
    }       
    
}
票数 0
EN

Stack Overflow用户

发布于 2020-08-06 11:32:26

由于异常状态,不支持持久化合成类。在您的例子中,重构类以摆脱那些合成类是唯一可靠的选择。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63266488

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档