序列化丢属性
- 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
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