람다를 연재하는 방법?
어떻게 하면 우아하게 람다를 연재할 수 있을까?
예를 들어, 아래 코드는NotSerializableException
. 생성하지 않고 어떻게 해결할 수 있는가?SerializableRunnable
"접속" 인터페이스?
public static void main(String[] args) throws Exception {
File file = Files.createTempFile("lambda", "ser").toFile();
try (ObjectOutput oo = new ObjectOutputStream(new FileOutputStream(file))) {
Runnable r = () -> System.out.println("Can I be serialized?");
oo.writeObject(r);
}
try (ObjectInput oi = new ObjectInputStream(new FileInputStream(file))) {
Runnable r = (Runnable) oi.readObject();
r.run();
}
}
자바 8은 여러 경계를 추가하여 여러 종류의 교차점에 물체를 캐스팅할 수 있는 가능성을 소개한다.따라서 일련화의 경우 다음과 같이 쓸 수 있다.
Runnable r = (Runnable & Serializable)() -> System.out.println("Serializable!");
그리고 람다 자동 연재가 가능해진다.
방법 참조에도 동일한 구조를 사용할 수 있다.예를 들어 이 코드:
import java.io.Serializable;
public class Test {
static Object bar(String s) {
return "make serializable";
}
void m () {
SAM s1 = (SAM & Serializable) Test::bar;
SAM s2 = (SAM & Serializable) t -> "make serializable";
}
interface SAM {
Object action(String s);
}
}
직렬화할 수 있는 대상 유형을 사용하여 람다 식 및 메서드 참조를 정의하십시오.
굉장히 못생긴 캐스팅.사용 중인 기능 인터페이스에 대해 직렬화할 수 있는 확장을 정의하고 싶은 경우
예를 들면 다음과 같다.
interface SerializableFunction<T,R> extends Function<T,R>, Serializable {}
interface SerializableConsumer<T> extends Consumer<T>, Serializable {}
그러면 람다를 받아들이는 방법은 다음과 같이 정의될 수 있다.
private void someFunction(SerializableFunction<String, Object> function) {
...
}
그리고 그 기능을 부르면서 어떤 추한 캐스팅도 없이 람다를 통과할 수 있다.
someFunction(arg -> doXYZ(arg));
Beam/Dataflow 코드를 만드는 동안 누군가가 여기에 있는 경우:
Beam은 자체 SerialableFunction Interface를 가지고 있으므로 더미 인터페이스나 자세한 캐스트가 필요하지 않다.
Kryo와 같은 다른 직렬화 프레임워크로 전환하려는 경우, 구현된 인터페이스가 구현해야 하는 다중 범위 또는 요구 사항을 제거할 수 있다.Serializable
접근방법은
- 수정하기
InnerClassLambdaMetafactory
항상 일련화에 필요한 코드를 생성하다 - 직접 전화:
LambdaMetaFactory
탈직렬화 중에
자세한 내용 및 코드는 이 블로그 게시물을 참조하십시오.
참조URL: https://stackoverflow.com/questions/22807912/how-to-serialize-a-lambda
'programing' 카테고리의 다른 글
Java에서 "실행 가능" 대 "스레드 확장" (0) | 2022.04.20 |
---|---|
랜드()를 사용할 때 이 특정 색상 패턴을 얻는 이유는? (0) | 2022.04.20 |
sprintf/snprintf 중 어느 것이 더 안전한가? (0) | 2022.04.20 |
루트 Vue 구성 요소의 Vue.use vs Vue.component (0) | 2022.04.20 |
Vuejs 계산된 속성 및 jquery ui 정렬 가능 문제 (0) | 2022.04.20 |