code: @SuppressWarnings("unchecked")
  	public <T extends Serializable> void bind(ObjectProperty<T> property, String key) {
  		byte[] value = prefs.getByteArray(validateKey(key), null);
  		if (value != null && value.length > 0) {
  			try (ObjectInputStream stream = new ObjectInputStream(
  					new ByteArrayInputStream(Base64.getDecoder().decode(value)))) {
  				property.set((T) stream.readObject());
  			} catch (Exception e) {
  				throw new RuntimeException(e);
  			}
  		}
  		property.addListener(o -> {
  			T v = property.getValue();
  			if (v == null) {
  				prefs.putByteArray(key, new byte[] {});
  				return;
  			}
  			try (ByteArrayOutputStream obj = new ByteArrayOutputStream()) {
  				try (ObjectOutputStream stream = new ObjectOutputStream(obj)) {
  					stream.writeObject(v);
  					stream.flush();
  				}
  				prefs.putByteArray(key, Base64.getEncoder().encode(obj.toByteArray()));
  			} catch (Exception e) {
  				throw new RuntimeException(e);
  			}
  		});
  	}
docs: Generates a bidirectional binding between the {@link Property} and the
  application store value identified by the {@code key} {@link String}.
  
  @param <T>
  {@link Serializable} small object
  @param property
  {@link Property} to bind
  @param key
  unique application store key