```xml
<dependency>
    <groupId>org.noear</groupId>
    <artifactId>solon-serialization-properties</artifactId>
</dependency>
```

#### 1、描述

序列化扩展插件，（基于 sanck3 实现）为 Solon Serialization 提供类似 properties 和 jsonpath 格式参数的适配。可参数支持（v2.7.6 后支持）：

* ?user.id=1&user.name=noear&user.type[0]=a&user.type[1]=b&user.birthday=2020-01-01
* ?type[]=a&type[]=b
* ?order[id]=a

输出格式示例（properties 格式，通过前端指定头信息 "X-Serialization=@properties" 控制输出）：

```
user.id=1
user.name=noear
user.type[0]=a
user.type[1]=b
```


#### 2、主要接口实现类


|  类 | 实现接口 | 备注 |
| -------- | -------- | -------- |
| PropertiesStringSerializer  | Serializer, EntityStringSerializer | properties  序列化器（v3.6.0 后为主力） |
| PropertiesEntityConverter  | EntityConverter   | properties 实体转换器（v3.6.0 后支持） |
| PropertiesRenderFactory   | RenderFactory     | 用于处理 properties 渲染输出（v3.6.0 后将标为弃用）     |
| PropertiesActionExecutor  | ActionExecuteHandler | 用于处理类似 properties 和 jsonpath 格式参数的请求（v3.6.0 后将标为弃用） |

何时会被时用？当参数名带有 `.` 或 `[` 符号时会执行。


支持手动获取已配置的序列化接口：

```java
Serializer<String> serializer = Solon.app().serializers().get(SerializerNames.AT_PROPERTIES);
Serializer<String> serializer = Solon.context().getBean(PropertiesStringSerializer.class);
```

#### 3、高级格式化定制（基于接口）


v3.6.0 后，可使用新接口（旧接口，将标为弃用）：

```java
@Configuration
public class DemoConfig {
    @Bean
    public void config(PropertiesStringSerializer serializer) {
        //允许 get 请求处理（默认为 true）
        serializer.allowGet(true);

        //允许 post form 请求处理（默认为 false）
        serializer.allowPostForm(false);
    }
}
```


默认只处理 get 请求，如果需要包括 from-data 和 formUrlencoded 处理，需要配置：//旧定制接口 v3.6.0 后标为弃用

```java
@Configuration
public class DemoConfig {
    @Bean
    public void config(@Inject PropertiesActionExecutor executor){
        //允许 get 请求处理（默认为 true）
        executor.allowGet(true)
        
        //允许 post form 请求处理（默认为 false）
        executor.allowPostForm(false);
    }
}
```


#### 3、个性化输出定制

```java
public class User{
    public long id;
    public String name;
    public String[] type; 
    
    //格式化日期
    @ONodeAttr(format = "yyyy-MM-dd") //尽量不使用个性化定制//这样不会依赖具体框架
    public Date birthday;
}

public enum BookType {
    NOVEL(2,"小说"),
    CLASSICS(3,"名著");

    @ONodeAttr 
    public final int code; //使用 code 做为序列化的字段
    public final String des;
    BookType(int code, String des){this.code=code; this.des=des;}
}
```