이제 몇 번씩 클래스를 구성하는 방법에 대한 인터페이스를 정의해야하는 유스 케이스가 생겼습니다. 객체를 직렬화하고 직렬화를 해제 할 수있는 인터페이스를 정의하는 인터페이스 클래스를 만들고 싶다면 (예를 들어, 데이터베이스에 입력하고 JSON으로 보내려면 등). 당신은 다음과 같이 작성할 수 있습니다건설 용 인터페이스 만들기
abstract class Serializable {
String serialize();
Serializable unserialize(String serializedString);
}
을하지만 serialize()
제대로 인스턴스 방법으로 지금은 문제가 있고, unserialize()
대신 정적 메소드이어야한다 (상속하지 않은 또는 인터페이스에 의해 시행) 또는 생성자 (상속 받지도 않음).
이것은 Serializable
인터페이스를 impliment 클래스가 serialize()
방법을 정의하는 데 필요한 상태를 잎하지만 static unserialize()
방법 또는 Foo.fromSerializedString()
생성자를 정의하는 클래스를 필요로 할 수있는 방법은 없습니다. 오히려 복잡하고 추악한
Foo foo = new Foo();
foo = foo.unserialize(serializedString);
:
당신이 인스턴스 메서드 unserialize()
을하면, 다음과 같이 것 인 구현 클래스 Foo
을 일렬 화를 푸는.
내가 생각할 수있는 유일한 다른 옵션은 Serializable
인터페이스에 주석을 추가하여 구현 클래스가 적절한 정적 메서드 또는 생성자를 정의하는지 확인하는 것입니다. 그러나 개발자가 코드를 놓치면 코드가 손상되고 오류가 발생하기 쉽습니다. 완성.
이렇게하려면 더 좋은 방법이 있습니까? 클래스를 구현하여 자신을 구성하는 방법을 정의하거나 일반적인 효과를주는 인터페이스를 가질 수있는 패턴이 있습니까?
Foo 개체에서 FooSerializer로 직렬화를 분리하면 어떨까요? 이 FooSerializer는 두 메서드를 인스턴스 메서드로 사용합니다. –
마지막 예제에서 코드는 serializedString에 Foo 객체가 있음을 이미 알고 있습니까? 일반적으로 deserialize 할 때 코드는이를 미리 알지 못합니다. 따라서 실제로는 정적 메서드 또는 deserialization을 시작한 다음 올바른 구체화 구현에 위임 할 함수가 필요합니다. 이것은 Map을 사용하여 매우 우아하게 수행 할 수 있습니다. 또한 Dart std lib에서는 일반적으로 encode/decode라고 불리며 Java 직렬화/직렬화를 선호합니다. –
저는 제가 의미하는 예를 들어 답을 추가했습니다. –