| 注解                     | 描述         | 备注         |
| -------------- | -------- | -------- |
| `ONodeCreator`     | 标准对象创建入口     |      |
| `ONodeAttr`          | 标注节点属性元           | （相对于 Options）提供了局部的定制支持     |


### 1、ONodeCreator

使用 ONodeCreator，可以指定反序列化用的构造方法。

```java
import org.noear.snack4.annotation.ONodeAttr;
import org.noear.snack4.annotation.ONodeCreator;
import java.util.Date;

public class DateDo {
    public Date date1 = new Date();
    
    @ONodeAttr(format="yyyy-MM-dd")
    public Date date2 = new Date();
    
    public DateDo() {
    }
    
    public DateDo(Date date1) {
        this.date1 = date1;
    }
    
    @ONodeCreator
    public DateDo(Date date1, Date date2) {
        this.date1 = date1;
        this.date2 = date2;
    }
}
```


### 2、ONodeAttr

ONodeAttr 的使用，优先级高于 Options，且用于局部。以时间为例：

```java
import org.noear.snack4.annotation.ONodeAttr;
import java.util.Date;

public class DateDo {
    public Date date1 = new Date();
    
    @ONodeAttr(format="yyyy-MM-dd")
    public Date date2 = new Date();
}
```

更详细的 ONodeAttr 接口：

```java
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE})
public @interface ONodeAttr {
    /**
     * 键名
     */
    String name() default "";

    /**
     * 描述
     */
    String description() default "";

    /**
     * 必须的
     */
    boolean required() default true;

    /**
     * 格式化
     */
    String format() default "";

    /**
     * 时区
     */
    String timezone() default "";

    /**
     * 扁平化
     */
    boolean flat() default false;

    /**
     * 特性
     */
    Feature[] features() default {};    
    
    /**
     * 乎略
     */
    boolean ignore() default false;

    /**
     * 是否编码（序列化）
     */
    boolean encode() default true;

    /**
     * 是否解码（反序列化）
     */
    boolean decode() default true;

    /**
     * 自定义编码器
     */
    Class<? extends ObjectEncoder> encoder() default ObjectEncoder.class;

    /**
     * 自定义解码器
     */
    Class<? extends ObjectDecoder> decoder() default ObjectDecoder.class;
}
```