4

다른 인스턴스 인 java.lang.ClassclassOf[MyClass]과 동일하지만 SerialVersionUID이 있으며이 인스턴스에는없는 인스턴스를 만들어야합니다. MyClass은 Scala-2.10 클래스입니다. 하나의 문제는 자바에서 SerialVersionUIDstatic final이고 스칼라가 SerialVersionUID인데 스칼라에는 통계가 없기 때문입니다.스칼라에서 클래스 [_] 인스턴스에 SerialVersionUID를 추가하는 방법은 무엇입니까?

val ctclass = javassist.ClassPool.getDefault().get("mypackagage.MyClass") 
    val field = javassist.CtField.make(
     "private static final long serialVersionUID = 1L;", 
     ctclass) 
    ctclass.addField(field) 
    val cls = ctclass.toClass() 

그러나, 이것은하지 않습니다 조용한 작업 스칼라 클래스 : 만약 MyClass

내가이 사용와 Javassist을 할 수있을 것이라고 생각하는 자바 클래스이다. 나는 de-serialization을 위해 이것을 ClassLoader에서 사용하려고 시도했다. deserialization 중에 컴파일 또는 런타임 오류가 없었지만 deserialize 된 객체가 불완전하므로 약간의 미묘한 문제가 있어야합니다. 세부 사항은 here입니다. 아마도 문제는 스칼라에서 static final 필드가 처리되는 방식과 Javassist가 Java를 이해하는 데서 만 알 수 있습니다. Java. Javassist 또는 다른 방법을 사용하여 Scala 클래스에 대해 100 % 올바른지 확인하려면 어떻게해야합니까?

+0

안녕하세요, de/serializing을 위해 어떤 도구를 사용하고 계시고 수업이 불완전한 지 자세히 설명해 주시겠습니까? 그냥 추측하지만, 필요한 정보가 바이트 코드에 없다면 절인 된 스칼라 서명 주석에있을 수있는 유일한 장소가 아닙니다. (http://stackoverflow.com/questions/16456931/ scala-store-information-that-can-be-in-java)은 어디에 있습니까? 절인 된 스칼라 서명에 올바른 정보가 누락 된 것일 수 있습니까? (나는 비슷한 스칼라 서명을 작성하여 유사한 문제를 해결했다.이 접근법이 더 일반적으로 작동하는지 알고 싶다.) –

+0

@Julian Peeters, 나는 평범한 자바 직렬화를 사용하고있다. MyClass에는 소스에 지정된 'serialVersionUID'가 없으므로 기본 해시 기반을 사용하고 있습니다. 문제는 클래스가 라이브러리의 패키지 사이를 이동하여 클래스의 소스가 텍스트 그대로 동일하더라도 기본 serialVersionUID를 변경한다는 것입니다. 나는 당신이 언급 한 문제 및 해결책을 보는 데 관심이있을 것입니다. –

+0

내 문제는 내가 큰 json 스키마를 스칼라 케이스 클래스로 옮겨 쓰는 것이 지쳤다는 것과 런타임에 사례 클래스를 정의 및로드하여이를 리플렉션 ([constr'n] 아래)으로 인스턴스화하여 해결했다고 (http : // 비트. ly/192xjUp). objectWeb의 ASMifier와 전체적으로 'diff -y'를 사용했지만 적절한 스칼라 서명 주석을 제공 할 때까지 생성 된 클래스를 직렬화 할 수 없었습니다. 나는 특별히 Scala 시그마를 채굴하는 Salat와 연재 중이었습니다. 그래서 아마도 "못을 찾으려는 것"이었을지 모르겠지만, 오랫동안 "불완전한"것은 아마도 "스칼라 시그마에 올바른 정보를 놓치고있는"것을 의미한다고 생각했습니다. –

답변

2

나는 다음 클래스를 컴파일하는 경우 :

@SerialVersionUID(1L) 
object MyClass { 
} 

$의 scalac MyCLass.scala을

$은 javap -cp MyClass에 $

Compiled from "MyClass.scala" 
public final class MyClass$ { 
    public static final MyClass$ MODULE$; 
    public static final long serialVersionUID; 
    public static {}; 
} 

내가 javaassist에 익숙하지 않은 해요,하지만이 추가 필드 인 FWIW를 넣어야하는 위치를 보여줍니다.

관련 문제