• Chào bạn, hãy đăng ký hoặc đăng nhập để tham gia cùng bọn mình và sử dụng được đầy đủ chức năng của diễn đàn :).
nahkd123

Hướng dẫn Cách làm cho 1 object lưu được vào config (sử dụng ConfigurationSerializable)

nahkd123

DEVELOPER
THÀNH VIÊN
Tham gia
21/01/2018
Bài viết
728
Chắc khá nhiều ae cũng đã biết đến ConfigurationSerializable, một interface để làm cho object có thể được lưu vào file config. Vậy hôm nay, mình xin hướng dẫn về ConfigurationSerializable dành cho ae nào chưa biết.

1. ConfigurationSerializable là gì?
ConfigurationSerializable là một interface giúp cho việc lưu object vào file config dễ dàng hơn. Thường thì ae sẽ yêu cầu ConfigurationSection thay vì dùng interface này, tuy nhiên nó có thể làm gây rối file config.

2. Cách sử dụng
Một khi đã implement ConfigurationSerializable vào, bạn sẽ được thêm method có tên là serialize() (trả về Map<String, Object>). Công việc còn lại là trả về cái map đấy, trong đó:
Key(String): Một key nào đấy để hiện thị trong file config cũng như việc đọc từ config
Value(Object): Object nào cũng được. Để đảm bảo không bị lỗi, nếu object đấy không phải String/Integer/Double(Float)/Boolean hay object đấy chưa implement ConfigurationSerializable thì bạn nên implement cái interface vào object con luôn.

3. Cách để đọc
Nếu bạn cố gắng đọc từ file config thì nó sẽ báo lỗi. Do đó, trong class còn phải thêm 1 trong 3 thứ sau (cái nào cũng được):
- 1 static method tên deserialize(Map<String, Object>) trả về object
- 1 static method tên valueOf(Map<String, Object>) trả về object
- 1 constructor chứa Map<String, Object>
Cái map thì nó sẽ giống hệt với lúc mà chúng ta vừa lưu load lại (trừ cái hashCode)

4. Bước cuối cùng
Để cho nó có thể đọc cũng như lưu vào config, chúng ta cần register cái class (chắc chắn ko phải là object) sử dụng ConfigurationSerialization.registerClass(Class<?>), và sau đó compile.

Example (1 phần code trong plugin sắp tới):
Mã:
@Override
    public Map<String, Object> serialize() {
        Map<String, Object> output = new HashMap<String, Object>();
        output.put("head-pose", headPose.getX() + " " + headPose.getY() + " " + headPose.getZ());
        output.put("body-pose", bodyPose.getX() + " " + bodyPose.getY() + " " + bodyPose.getZ());
        output.put("left-leg-pose", leftLegPose.getX() + " " + leftLegPose.getY() + " " + leftLegPose.getZ());
        output.put("right-leg-pose", rightLegPose.getX() + " " + rightLegPose.getY() + " " + rightLegPose.getZ());
        output.put("left-hand-pose", leftHandPose.getX() + " " + leftHandPose.getY() + " " + leftHandPose.getZ());
        output.put("right-hand-pose", rightHandPose.getX() + " " + rightHandPose.getY() + " " + rightHandPose.getZ());
        return output;
    }
    public static ArmorStandPositions deserialize(Map<String, Object> map) {
        EulerAngle headPose = Ultility.parseToAngle((String) map.getOrDefault("head-pose", "0.0 0.0 0.0"));
        EulerAngle bodyPose = Ultility.parseToAngle((String) map.getOrDefault("body-pose", "0.0 0.0 0.0"));
        EulerAngle leftLegPose = Ultility.parseToAngle((String) map.getOrDefault("left-leg-pose", "0.0 0.0 0.0"));
        EulerAngle rightLegPose = Ultility.parseToAngle((String) map.getOrDefault("right-leg-pose", "0.0 0.0 0.0"));
        EulerAngle leftHandPose = Ultility.parseToAngle((String) map.getOrDefault("left-hand-pose", "0.0 0.0 0.0"));
        EulerAngle rightHandPose = Ultility.parseToAngle((String) map.getOrDefault("right-hand-pose", "0.0 0.0 0.0"));
       
        ArmorStandPositions output = new ArmorStandPositions();
        output.headPose = headPose;
        output.bodyPose = bodyPose;
        output.leftLegPose = leftLegPose;
        output.rightLegPose = rightLegPose;
        output.leftHandPose = leftHandPose;
        output.rightHandPose = rightHandPose;
        return output;
    }
 
Similar content Most view Xem thêm
Back
Top Bottom