UserData使用总结

前一段时间做一个在线订单系统,因为有好几项服务可供选择,要求在选每一种服务后进入下一步,在操作过程中还可以通过上一步来回到上一次的服务选购里重新下订,每一个种服务都有好多选项可选,整个过程中有较大的数据量要临时存储,

现在最流行的本地存储莫过于 cookie 的应用,但 浏览器对cookie有很多限制 ,最大的限制在于其对cookie 总大小,仅为 4K 左右(包括名(name)、值(value)和等号)。

对于复杂一点的应用和需求,仅有的 4K 大小还是有点相形见绌,其实很多浏览器(IE、Firefox、Safari)本身也提供了自己的本地存储的功能,或许在特定的环境下能满足我们。因此自己通过学习整理,写了一个userData的简单操作类。

应用范围

UserData是微软为IE专门在系统中开辟的一块存储空间,所以说只支持Windows+IE的组合,实际测试在2000(IE5.5)、XP(IE6、IE7),Vista(IE7)下都是可以正常使用的。

在哪儿?

在XP下,一般位于C:/Documents and Settings/用户名/UserData,有些时候会在C:/Documents and Settings/用户名/Application Data/Microsoft/Internet Explorer/UserData。

在Vista下,位于C:/Users/用户名/AppData/Roaming/Microsoft/Internet Explorer/UserData。

 

  1. 从安全方面考虑,一个 userData 存储区只能用于同一目录和对同一协议进行存储。
  2. 如果使用 userData behavior 不正确可能会对你的应用造成危害,userData 存储区中的数据没有加密因而不安全的。任何可以访问 UserData 保存磁盘的应用都可以访问该数据,所以,推荐不要保存敏感的数据,比如信用卡号,详细:《Security Considerations: DHTML and Default Behaviors》
  3. userData behavior 会跨 session 存储信息到存储区,这提供了动态的数据结构和比 cookie(一般 4KB) 更大的容量。userData 存储区的容量依赖于 domain 的安全域。下表显示的是 userData 存储最大容量,对单独文档和整个域名的所有文档都适用,但基于安全域。
  4. 如果设置 userData behavior 到 html、head、title 或者 style 对象上,当 save 和 load 方法被调用时会出错。如果必须设置到 style 中,可以设置内联或者文档头,例如:
    <style>
        .storeuserData {behavior:url(#default#userData);}
    </style>
  5. 对于 userData behavior 来说 ID 是可选的,但是如果有,则会改善执行性能。
  6. userData 可以将数据以 XML 格式保存在客户端计算机上,一般保存在 C(WIN 系统盘):/Documents and Settings/XXX/UserData/ 文件夹下。
  7. userData 数据一直存在,除非人为删除或者用脚本设置该数据的失效日期(expires)。

容量

网页制作完成手册中这样说:

Security Zone

Document Limit (KB)

Domain Limit (KB)

Local Machine

128

1024

Intranet

512

10240

Trusted Sites

128

1024

Internet

128

1024

Restricted

64

640

线上使用时,单个文件的大小限制是128KB,一个域名下总共可以保存1024KB的文件,文件个数应该没有限制。在受限站点里这两个值分别是64KB和640KB,所以如果考虑到各种情况的话,单个文件最好能控制64KB以下。

如何使用?

用下面的JS语句就可以建立一个支持UserData的对象:

o = document.createElement('input');
o.type = "hidden";
o.addBehavior ("#default#userData");
//UserData.o.style.behavior = "url('#default#userData')" ;
//上面的语句也是一样的作用
document.body.appendChild(o);

说白了UserData就是样式里的一个Behavior,所以这样写也是一样的:

<input type=hidden class= storeuserData />
<style>
.storeuserData {behavior:url(#default#userData);}
</style>

UserData可以绑定在大多数的html标签上,具体为:

A, ACRONYM, ADDRESS, AREA, B, BIG, BLOCKQUOTE, BUTTON, CAPTION, CENTER, CITE, CODE, DD, DEL, DFN, DIR, DIV, DL, DT, EM, FONT, FORM, hn, HR, I, IMG, INPUT type=button, INPUT type=checkbox, INPUT type=file, INPUT type=hidden, INPUT type=image, INPUT type=password, INPUT type=radio, INPUT type=reset, INPUT type=submit, INPUT type=text, KBD, LABEL, LI, LISTING, MAP, MARQUEE, MENU, OBJECT, OL, OPTION, P, PLAINTEXT, PRE, Q, S, SAMP, SELECT, SMALL, SPAN, STRIKE, STRONG, SUB, SUP, TABLE, TEXTAREA, TT, U, UL, VAR, XM

UserData对象有以下的属性和方法:

属性

描述

expires

设置或读取文件过期时间

XMLDocument

读取文件的XML DOM

方法

描述

getAttribute

读取指定属性的值

load

打开文件

removeAttribute

删除指定的属性

save

保存文件

setAttribute

为指定属性赋值

UserData文件实际上就是一XML文件,通过文件名->属性的方式保存字符串,如以下一段代码:

o.setAttribute("code", "hello world!");
o.save("baidu");

    执行后,UserData文件夹中会生成一个baidu[1].xml文件,其中的内容是:
<ROOTSTUB code="hello,world!"/>

 

UserData

 

 

<think>好的,我现在需要帮助用户了解Matlab中UserData使用方法。首先,回顾用户的历史对话,用户之前询问了关于点击回调函数的用法,我在回答中提到了UserData作为数据传递的一种方式。现在用户明确想深入了解UserData,所以需要详细讲解其用法示例。 首先,要确定UserData的基本概念,它是Matlab图形对象的一个属性,可以存储任意类型的数据。接下来需要说明它的主要作用,比如在GUI开发中传递数据,尤其是在回调函数之间共享信息。然后,用户可能需要知道如何在不同类型的对象上使用UserData,比如图形窗口、按钮、坐标轴等。 接下来,应该分步骤讲解使用方法。例如,如何设置获取UserData,通过setget函数,或者直接使用属性访问方式。同时,需要给出具体的代码示例,比如在按钮回调中存储数据,然后在另一个回调中读取。还要提到App Designer中的UserData与传统GUIDE的区别,因为用户之前提到了App Designer的回调函数。 用户可能需要了解传统GUI(GUIDE)现代App Designer中的不同用法。在传统GUI中,UserData常用于各个图形对象,而App Designer推荐使用私有属性,但UserData仍然可用。需要强调两者的区别,并说明在哪种情况下更适合使用UserData。 此外,用户可能关心数据传递的具体场景,比如多个回调函数之间共享数据,或者在不同组件之间传递信息。需要举出实际例子,比如记录点击次数、保存临时计算结果等。还要提到如何存储结构化数据,比如结构体或类对象,以便管理多个变量。 另外,用户可能遇到的一些常见问题,比如如何避免使用全局变量,这时候UserData是一个替代方案。还要注意UserData的覆盖问题,即每次设置会替换之前的数据,因此需要合理组织数据结构。同时,可以提到调试技巧,比如在UserData存储日志信息。 最后,要总结优缺点,帮助用户决定何时使用UserData。比如优点在于灵活性跨组件共享,缺点可能在数据管理复杂时难以维护。同时,提供相关问题,引导用户进一步学习,比如如何结合UserData与持久变量,或者处理动态GUI中的数据。 需要确保回答结构清晰,分点讲解,每个部分都有代码示例,并且语言简洁易懂。同时,结合用户之前的问题,强调UserData在回调函数中的应用,以满足用户的实际需求。</think>### MATLAB UserData 使用详解 UserData 是 MATLAB 图形对象(如按钮、坐标轴、图形窗口等)的**通用数据容器属性**,可用于存储任意类型的数据(数值、结构体、单元格数组、类对象等)。其核心作用是**在 GUI 组件间传递数据**,尤其适用于回调函数之间的数据共享[^1]。以下是具体使用方法场景分析: --- #### 一、基本操作 1. **设置 UserData** ```matlab % 传统语法 (GUIDE) set(handles.button1, 'UserData', struct('count', 0)); % App Designer 语法 app.UIFigure.UserData = rand(3); % 存储矩阵数据 app.Button.UserData = datetime('now'); % 存储时间戳 ``` 2. **读取 UserData** ```matlab % 传统GUI data = get(handles.axes1, 'UserData'); % App Designer currentData = app.DropDown.UserData; ``` --- #### 二、典型应用场景 1. **跨回调函数共享数据** ```matlab % 示例:按钮点击计数器 function Button1Pushed(app, event) if isempty(app.Button1.UserData) app.Button1.UserData = 1; % 初始化 else app.Button1.UserData = app.Button1.UserData + 1; end disp(['点击次数:', num2str(app.Button1.UserData)]); end ``` 2. **存储复杂数据结构** ```matlab % 保存实验配置参数 config = struct('sampleRate', 1000, 'duration', 5, 'channels', 8); app.UIFigure.UserData = config; % 在另一回调中读取 function StartExperiment(app, event) cfg = app.UIFigure.UserData; disp(['采样率:', num2str(cfg.sampleRate), 'Hz']); end ``` 3. **动态GUI组件管理** ```matlab % 存储动态创建的按钮句柄 newBtn = uibutton(app.UIFigure, 'Text','动态按钮'); app.UIFigure.UserData.buttons = [app.UIFigure.UserData.buttons, newBtn]; % 批量删除动态组件 function DeleteButtons(app, event) arrayfun(@delete, app.UIFigure.UserData.buttons); app.UIFigure.UserData.buttons = []; end ``` --- #### 三、App Designer 与传统 GUIDE 的对比 | 特性 | App Designer | GUIDE | |---------------------|--------------------------------|-----------------------| | 访问方式 | 直接属性访问 `obj.UserData` | `get/set` 函数 | | 推荐存储位置 | 私有属性 (更规范) | UserData (常用) | | 数据类型限制 | 无 | 无 | | 多组件协调 | 通过容器组件共享 UserData | 需手动传递句柄 | --- #### 四、高级技巧 1. **嵌套数据存取** ```matlab % 存储多层级数据 app.UIFigure.UserData.experiment = struct(... 'params', cfg, ... 'rawData', [], ... 'processedData', []); % 增量更新数据 app.UIFigure.UserData.experiment.rawData = load('data.mat'); ``` 2. **结合 Web 请求**(参考用户历史记录[^1]) ```matlab function LoadAPIData(app, event) try apiData = webread("https://api.example.com/data"); app.UIFigure.UserData.apiResponse = apiData; % 存储API结果 catch app.UIFigure.UserData.apiError = true; % 记录错误状态 end end ``` 3. **对象持久化** ```matlab % 存储自定义类实例 classdef Sensor < handle properties ID CalibrationData end end sensor1 = Sensor(); app.UIFigure.UserData.sensors{1} = sensor1; ``` --- #### 五、注意事项 1. **数据覆盖风险**:每次设置 UserData 会完全替换原有内容,建议使用结构体组织多字段数据 ```matlab % 错误示例(直接覆盖) app.Button.UserData = 10; app.Button.UserData = 'text'; % 前值丢失 % 正确示例(结构体扩展) app.Button.UserData.value = 10; app.Button.UserData.label = 'text'; ``` 2. **性能优化**:避免在 UserData存储过大的数据集(如百万级矩阵),建议改用 `app.Properties` 或外部文件 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值