From 3f924b004c43d8030eab82146cfd49fe52d3c5d5 Mon Sep 17 00:00:00 2001 From: ZhanGSKen Date: Sat, 31 Jan 2026 19:47:12 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E5=BA=94=E7=94=A8Data?= =?UTF-8?q?=E5=8C=BA=E6=95=B0=E6=8D=AE=E5=A4=87=E4=BB=BD=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- appbase/build.properties | 4 +- .../winboll/studio/appbase/MainActivity.java | 23 ++- .../studio/appbase/model/TestBean.java | 154 ++++++++++++++++++ libappbase/build.properties | 4 +- 4 files changed, 180 insertions(+), 5 deletions(-) create mode 100644 appbase/src/main/java/cc/winboll/studio/appbase/model/TestBean.java diff --git a/appbase/build.properties b/appbase/build.properties index 7698d12..b52d6b3 100644 --- a/appbase/build.properties +++ b/appbase/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Sat Jan 31 10:50:44 GMT 2026 +#Sat Jan 31 11:44:12 GMT 2026 stageCount=12 libraryProject=libappbase baseVersion=15.15 publishVersion=15.15.11 -buildCount=20 +buildCount=26 baseBetaVersion=15.15.12 diff --git a/appbase/src/main/java/cc/winboll/studio/appbase/MainActivity.java b/appbase/src/main/java/cc/winboll/studio/appbase/MainActivity.java index 3517bd4..bea352c 100644 --- a/appbase/src/main/java/cc/winboll/studio/appbase/MainActivity.java +++ b/appbase/src/main/java/cc/winboll/studio/appbase/MainActivity.java @@ -17,6 +17,9 @@ import cc.winboll.studio.libappbase.activities.FTPBackupsActivity; import cc.winboll.studio.libappbase.dialogs.SFTPBackupsSettingsDialog; import cc.winboll.studio.libappbase.models.SFTPAuthModel; import java.util.HashMap; +import android.os.Environment; +import java.io.File; +import cc.winboll.studio.appbase.model.TestBean; /** * @Author ZhanGSKen @@ -40,13 +43,25 @@ public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - ToastUtils.show("onCreate"); // 显示 Activity 创建提示(调试用) + //ToastUtils.show("onCreate"); // 显示 Activity 创建提示(调试用) setContentView(R.layout.activity_main); // 加载主界面布局 // 初始化 Toolbar 并设置为 ActionBar mToolbar = findViewById(R.id.toolbar); setActionBar(mToolbar); // 将 Toolbar 替代系统默认 ActionBar + + initTestData(); } + + void initTestData() { + TestBean bean = new TestBean(); + bean.setTestNum1(456); + TestBean.saveBeanToFile(getFilesDir().getAbsolutePath() + getDataFilesTestBeanPath(), bean); + } + + String getDataFilesTestBeanPath() { + return "/BaseBaen/"+TestBean.class.getName()+".json"; + } /** * 创建菜单时回调(加载工具栏菜单) @@ -154,6 +169,11 @@ public class MainActivity extends Activity { if (authModel == null) { dlg.show(); } else { + // 1. 构建应用Data目录待备份文件Map + HashMap dataFileMap = new HashMap<>(); + // 存入文件:key=唯一标识,value=应用外部文件目录下的相对路径(与原addSdcardFile参数一致) + dataFileMap.put(TestBean.class.getName() + ".json", + getDataFilesTestBeanPath()); // 1. 构建SDCard目录待备份文件Map(与BackupUtils的SdcardMap泛型一致:String-String) HashMap sdcardFileMap = new HashMap<>(); // 存入文件:key=唯一标识,value=应用外部文件目录下的相对路径(与原addSdcardFile参数一致) @@ -163,6 +183,7 @@ public class MainActivity extends Activity { // 2. 构建Intent,指定跳转到FTPBackupsActivity Intent ftpBackupsIntent = new Intent(getApplicationContext(), FTPBackupsActivity.class); // 3. 序列化传递Map参数(使用FTPBackupsActivity中定义的常量,避免硬编码) + ftpBackupsIntent.putExtra(FTPBackupsActivity.EXTRA_DATA_DIR_FILE_MAP, dataFileMap); ftpBackupsIntent.putExtra(FTPBackupsActivity.EXTRA_SDCARD_DIR_FILE_MAP, sdcardFileMap); // 若需要传Data目录的Map,同理:ftpBackupsIntent.putExtra(FTPBackupsActivity.EXTRA_DATA_DIR_FILE_MAP, dataFileMap); diff --git a/appbase/src/main/java/cc/winboll/studio/appbase/model/TestBean.java b/appbase/src/main/java/cc/winboll/studio/appbase/model/TestBean.java new file mode 100644 index 0000000..ee3e70a --- /dev/null +++ b/appbase/src/main/java/cc/winboll/studio/appbase/model/TestBean.java @@ -0,0 +1,154 @@ +package cc.winboll.studio.appbase.model; + +import android.util.JsonReader; +import android.util.JsonWriter; +import cc.winboll.studio.libappbase.BaseBean; +import cc.winboll.studio.libappbase.LogUtils; +import java.io.IOException; + +/** + * 测试实体类 + * 继承BaseBean实现JSON序列化/反序列化能力,提供基础int类型属性的封装与数据持久化支持 + * 适配Java7语法,遵循BaseBean统一的反射识别、JSON读写规范 + * @Author 豆包&ZhanGSKen + * @Date 2026/01/31 19:16:00 + * @LastEditTime 2026/02/01 10:46:00 + */ +public class TestBean extends BaseBean { + + // ====================================== 常量定义 ====================================== + /** 当前类的日志 TAG(用于调试输出) */ + public static final String TAG = "TestBean"; + + // ====================================== 成员属性 ====================================== + /** + * 测试数字属性(默认值:123) + * 基础int类型属性,用于测试BaseBean的JSON序列化/反序列化能力 + */ + private int testNum1; + + // ====================================== 构造方法 ====================================== + /** + * 无参构造器(默认初始化) + * 给testNum1赋值默认值123,满足反射实例化、JSON解析的无参构造要求 + */ + public TestBean() { + this.testNum1 = 123; + LogUtils.d(TAG, "TestBean无参构造器调用,testNum1默认初始化值:" + this.testNum1); + } + + /** + * 有参构造器(自定义初始化) + * @param testNum1 测试数字初始值 + */ + public TestBean(int testNum1) { + this.testNum1 = testNum1; + LogUtils.d(TAG, "TestBean有参构造器调用,传入testNum1:" + testNum1); + } + + // ====================================== Get/Set 方法 ====================================== + /** + * 设置测试数字属性值 + * @param testNum1 待设置的int类型值 + */ + public void setTestNum1(int testNum1) { + LogUtils.d(TAG, "setTestNum1调用,传入参数:" + testNum1); + this.testNum1 = testNum1; + } + + /** + * 获取测试数字属性值 + * @return 当前testNum1的int类型值 + */ + public int getTestNum1() { + LogUtils.d(TAG, "getTestNum1调用,返回值:" + this.testNum1); + return testNum1; + } + + // ====================================== 重写父类BaseBean方法 ====================================== + /** + * 重写父类方法:获取当前类的全限定名 + * 用于BaseBean反射识别、类名匹配等统一逻辑 + * @return 类全限定名(cc.winboll.studio.appbase.model.TestBean) + */ + @Override + public String getName() { + LogUtils.d(TAG, "getName方法调用,返回类全限定名:" + TestBean.class.getName()); + return TestBean.class.getName(); + } + + /** + * 重写父类方法:将当前对象序列化为JSON(持久化存储专用) + * 遵循BaseBean规范,先执行父类序列化逻辑,再处理子类专属字段 + * @param jsonWriter JSON写入器(外部传入的JSON流操作实例) + * @throws IOException JSON写入异常(流关闭、格式错误等) + */ + @Override + public void writeThisToJsonWriter(JsonWriter jsonWriter) throws IOException { + LogUtils.d(TAG, "writeThisToJsonWriter调用,传入参数JsonWriter:" + jsonWriter); + // 执行父类公共字段的序列化逻辑 + super.writeThisToJsonWriter(jsonWriter); + // 序列化子类专属字段testNum1 + jsonWriter.name("testNum1").value(this.getTestNum1()); + LogUtils.d(TAG, "writeThisToJsonWriter执行完成,已序列化testNum1:" + this.getTestNum1()); + } + + /** + * 重写父类方法:从JSON字段初始化当前对象属性(解析JSON专用) + * 先让父类处理公共字段,再匹配子类专属字段,不匹配则返回false跳过 + * @param jsonReader JSON读取器(外部传入的JSON流操作实例) + * @param name 当前解析的JSON字段名 + * @return true-字段解析成功;false-字段不匹配,需跳过/父类处理 + * @throws IOException JSON读取异常(字段类型不匹配、流中断等) + */ + @Override + public boolean initObjectsFromJsonReader(JsonReader jsonReader, String name) throws IOException { + LogUtils.d(TAG, "initObjectsFromJsonReader调用,传入参数:name=" + name + ",JsonReader=" + jsonReader); + // 父类优先处理公共字段,处理成功则直接返回 + if (super.initObjectsFromJsonReader(jsonReader, name)) { + LogUtils.d(TAG, "initObjectsFromJsonReader:字段" + name + "由父类BaseBean处理成功"); + return true; + } + // 解析子类专属字段 + if ("testNum1".equals(name)) { + this.setTestNum1(jsonReader.nextInt()); + LogUtils.d(TAG, "initObjectsFromJsonReader:解析testNum1成功,值为:" + this.getTestNum1()); + } else { + LogUtils.w(TAG, "initObjectsFromJsonReader:字段" + name + "不匹配,返回false跳过解析"); + // 字段不匹配,返回false表示跳过 + return false; + } + return true; + } + + /** + * 重写父类方法:从JSON读取器完整解析并初始化当前对象(JSON解析入口) + * 负责JSON对象的开始/结束标识处理,遍历所有字段并调用字段解析方法 + * 严格遵循writeThisToJsonWriter的序列化结构,保证解析一致性 + * @param jsonReader JSON读取器(外部传入的JSON流操作实例) + * @return 解析后的当前TestBean实例(支持链式调用) + * @throws IOException JSON解析异常(格式错误、字段缺失、流异常等) + */ + @Override + public BaseBean readBeanFromJsonReader(JsonReader jsonReader) throws IOException { + LogUtils.d(TAG, "readBeanFromJsonReader调用,传入参数JsonReader:" + jsonReader); + // 开始解析JSON对象,与序列化结构保持一致 + jsonReader.beginObject(); + // 遍历所有JSON字段 + while (jsonReader.hasNext()) { + String fieldName = jsonReader.nextName(); + LogUtils.d(TAG, "readBeanFromJsonReader:开始解析字段,fieldName=" + fieldName); + // 解析字段,不匹配则跳过该值 + if (!this.initObjectsFromJsonReader(jsonReader, fieldName)) { + jsonReader.skipValue(); + LogUtils.w(TAG, "readBeanFromJsonReader:字段" + fieldName + "解析失败,已跳过该值"); + } + } + // 结束JSON对象解析,必须调用避免流异常 + jsonReader.endObject(); + LogUtils.d(TAG, "readBeanFromJsonReader执行完成,JSON解析结束,当前TestBean实例testNum1:" + this.getTestNum1()); + // 返回当前实例,支持链式调用 + return this; + } +} + diff --git a/libappbase/build.properties b/libappbase/build.properties index 7698d12..b52d6b3 100644 --- a/libappbase/build.properties +++ b/libappbase/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Sat Jan 31 10:50:44 GMT 2026 +#Sat Jan 31 11:44:12 GMT 2026 stageCount=12 libraryProject=libappbase baseVersion=15.15 publishVersion=15.15.11 -buildCount=20 +buildCount=26 baseBetaVersion=15.15.12