作者s4300026 (s4300026)
看板C_Sharp
标题[问题] 如何根据System.Type做转型
时间Thu Sep 20 09:43:56 2018
是这样的
我有写一个序列化的方法把我的class存档
BinaryFormatter myBinaryFormatter = new BinaryFormatter();
myBinaryFormatter.Serialize(oFileStream, saveObj);
现在的问题是,我的saveObj会需要与时俱进的新增功能和变数
但每次更新我的class,我的旧的存档就无法被使用 (因为格式不符)
我目前想到的解决方法是用继承
像是这样:主名称 + 撰写日期,然後继承最後一版的class如下
class MyObj180920: object{}
class MyObj180925: MyObj180920{}
class MyObj181001: MyObj180925{}
然後我有个上层class manage
{
Object myObj;
System.Type myObjType;
}
每次我的程式会实体化最新的class和type
myObj = new MyObj180920;
myObjType = (new MyObj180920).GetType();
然後序列化的时候应该(我觉得)会将实作品(MyObj180920)存入硬碟
而非父类别型态(Object)
当我更新版本後(180925)
我期望我的反序列化能根据 myObjType 转型成正确的过往类别
而不用每次都做转型判断
switch (myObj.GetType().Name)
{
case "MyObj180920":
break;
case "MyObj180925":
break;
}
但是我不会用根据System.Type做转型指令,有人知道要怎麽用吗?
感谢大家拨冗观看~
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 60.250.235.221
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_Sharp/M.1537407838.A.1A0.html
1F:→ awwseed: 弄一个 Interface 让各个 Class 实作? 09/20 13:16
2F:推 anumis: 有试过json吗? 09/20 16:40
3F:→ s4300026: awwseed 我存的是class,所以应该不能用interface吧? 09/20 18:55
4F:→ s4300026: anumis json 完全没听过耶,或许是第三条路? 09/20 19:00
实际上我在找好的存档方式,因为每日要用mail和excel交进度,
每次都要调整excel格式和寄信
觉得很懒且步骤重复
所以想说写个小程式做协助
写了之後觉得好用
但後来发现存class後每次有个小更新
就会造成旧的class读档失败
深觉这样不是办法,
才想了这个办法,但实作上遇到困难,才跑上来问,以上。
※ 编辑: s4300026 (220.134.201.145), 09/20/2018 19:25:59
5F:→ testPtt: 用一个新class包装IMyObj介面栏位 序列化这个class 09/20 20:54
6F:→ s4300026: 这样就可以添加新interface栏位了吗? 09/21 07:33
7F:→ testPtt: 可能不行 没试过 我只用过明确结构的 会变动的好像不适合 09/21 09:07
8F:→ testPtt: 不过似乎继承IExtensibleDataObject可行 09/21 09:15
9F:推 sd016808: 如果只是新增属性 没有修改旧的属性名称 应该直接用json 09/21 13:26
10F:→ sd016808: 就可以处理了吧? 甚至也不需要那麽多版本的class 但如 09/21 13:27
11F:→ sd016808: 果每个版本之间的变化都很大 建议是实作每个版本之间的 09/21 13:27
12F:→ sd016808: 转换 根据版本来决定new哪个版本的class 然後在一版一 09/21 13:27
13F:→ sd016808: 版的转换到最新版 这样一定没问题 09/21 13:27
14F:推 totte: 用reflection 09/21 18:46
15F:推 jass970991: 我没想过这种问题 但如果是我 我会考虑给一个dictiona 09/23 00:28
16F:→ jass970991: ry<某种enum,object> 然後这个object 才是你的class 09/23 00:28
17F:→ jass970991: 要用的时候再转 每次更新时直接创新的class 不过这 09/23 00:28
18F:→ jass970991: 方法也不是很好 我觉得这个难题应该要先想清楚 为什 09/23 00:28
19F:→ jass970991: 麽这个class会有这麽高频的变动还不能用generic收纳这 09/23 00:28
20F:→ jass970991: 些变动 我自己是觉得有点怪 不过也可能我就真的刚好没 09/23 00:28
21F:→ jass970991: 遇到 09/23 00:28
22F:→ s4300026: 我觉得只要更新难免会多东西吧,要想怎麽处理更新前的存 09/23 10:27
23F:→ s4300026: 档 09/23 10:27
24F:推 jass970991: 主要是你这样更新 一开多条branch 开发 merge时就会爆 09/23 11:12
25F:→ jass970991: 炸了 所以我才会想说到底事需求真的这样 还是没考虑清 09/23 11:12
26F:→ jass970991: 楚 09/23 11:12
27F:→ s4300026: 我承认是我没有考虑清楚,原本就没有打算写给大程式,只 09/23 11:17
28F:→ s4300026: 想要几个简单的功能,没想到想要的东西越加越多 09/23 11:17
29F:推 jass970991: 那你要做的变更的数据形态可以做整合到同一个list或di 09/23 11:19
30F:→ jass970991: c里吗? 这样未来会比较好处理 09/23 11:19
31F:推 jass970991: 如果是会有function增加的问题 建议把单纯的资料拉出 09/23 11:22
32F:→ jass970991: 来做成model 序列化model就好 09/23 11:22
33F:→ s4300026: 我知道了,简言之,就是存资料,不要存方法,这样我反 09/25 11:41
34F:→ s4300026: 而觉得我该走DB,而不是走序列化 09/25 11:41