alibaba / alibaba/fastjson2

序列化丢属性

Open
#1,602 1 comment 0 reactions 0 assignees View on GitHub
bug
Dominant language
Java
Stars
4.4k
Forks
613
Avg merge
1d 22h
Merged PRs (30d)
6

Description

### 问题描述
FastJson2ObjectOutput.writeObject中属性JSONWriter.Feature.NotWriteDefaultValue造成boolean的值序列化丢失。

### 环境信息
- OS信息: win 10
- JDK信息: 1.8
- Fastjson2版本信息:2.0.31,2.0.34,2.0.33
- Dubbo : 3.2.2

```java
public void testWriteReadString() throws Exception {
QueryVo model = new QueryVo();
model.addOrderClause(new OrderClause("task_no", false));

FrameworkModel frameworkModel = new FrameworkModel();
Serialization serialization = frameworkModel.getExtensionLoader(Serialization.class).getExtension("fastjson2");
URL url = URL.valueOf("").setScopeModel(frameworkModel);
// write pojo, read failed
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
ObjectOutput objectOutput = serialization.serialize(url, outputStream);
objectOutput.writeObject(model);
objectOutput.flushBuffer();

byte[] bytes = outputStream.toByteArray();
ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes);
ObjectInput objectInput = serialization.deserialize(url, inputStream);
Object obj = objectInput.readObject();
Assertions.assertEquals(obj, objectInput.readObject());

frameworkModel.destroy();
}

**QueryVo.java**
public class QueryVo implements Serializable {
private int limit;
private int offset;
private Map queryObj;
private List orderClauses;

public int getLimit() {
return limit;
}

public void setLimit(int limit) {
this.limit = limit;
}

public int getOffset() {
return offset;
}

public void setOffset(int offset) {
this.offset = offset;
}

public Map getQueryObj() {
return queryObj;
}

public void setQueryObj(Map queryObj) {
this.queryObj = queryObj;
}

public List getOrderClauses() {
return orderClauses;
}

public void addOrderClause(OrderClause orderClause) {
if (this.orderClauses == null) {
this.orderClauses = new ArrayList<>();
}
this.orderClauses.add(orderClause);
}
}

**OrderClause.java**
public class OrderClause implements Serializable {
private String fieldName;
private boolean ascending = true;

public OrderClause(){

}

public OrderClause(String fieldName){
this.fieldName = fieldName;
}

public OrderClause(String fieldName, boolean ascending){
this.fieldName = fieldName;
this.ascending = ascending;
}

public String getFieldName() {
return fieldName;
}

public void setFieldName(String fieldName) {
this.fieldName = fieldName;
}

public boolean isAscending() {
return ascending;
}

public void setAscending(boolean ascending) {
this.ascending = ascending;
}
}
```

### 期待的正确结果
{"limit":0,"offset":0,"orderClauses":[{"ascending":false,"fieldName":"task_no"}]}

### 实际结果
{"limit":0,"offset":0,"orderClauses":[{"ascending":true,"fieldName":"task_no"}]}

#### 附加信息
* [EarthChen](https://github.com/EarthChen) 这个问题应该提给 fastjson 那边*

Contributor guide

Open the contributing guide

Research direction

Start at FastJson2ObjectOutput.writeObject and reproduce the issue with the provided testWriteReadString example, focusing on JSONWriter.Feature.NotWriteDefaultValue. Compare the serialized orderClauses output with the expected JSON, and consider the work complete when ascending:false survives serialization and deserialization.

Written by the indexing model from the issue text.

Assessment

Tech stack
java
Domain
backend
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Stale
Clarity
Clearly specified
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.