[问题] 如何根据System.Type做转型

楼主: s4300026 (s4300026)   2018-09-20 09:43:56
是这样的
我有写一个序列化的方法把我的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做转型指令,有人知道要怎么用吗?
感谢大家拨冗观看~
作者: awwseed (MOTO RIDER)   2018-09-20 13:16:00
弄一个 Interface 让各个 Class 实作?
作者: anumis (阿努米斯)   2018-09-20 16:40:00
有试过json吗?
楼主: s4300026 (s4300026)   2018-09-20 18:55:00
awwseed 我存的是class,所以应该不能用interface吧?anumis json 完全没听过耶,或许是第三条路?
作者: testPtt (测试)   2018-09-20 20:54:00
用一个新class包装IMyObj接口字段 序列化这个class
楼主: s4300026 (s4300026)   2018-09-21 07:33:00
这样就可以添加新interface字段了吗?
作者: testPtt (测试)   2018-09-21 09:07:00
可能不行 没试过 我只用过明确结构的 会变动的好像不适合不过似乎继承IExtensibleDataObject可行
作者: sd016808 (sd016808)   2018-09-21 13:26:00
如果只是新增属性 没有修改旧的属性名称 应该直接用json就可以处理了吧? 甚至也不需要那么多版本的class 但如果每个版本之间的变化都很大 建议是实作每个版本之间的转换 根据版本来决定new哪个版本的class 然后在一版一版的转换到最新版 这样一定没问题
作者: totte (totte)   2018-09-21 18:46:00
用reflection
作者: jass970991 (半糖绿假面超人)   2018-09-23 00:28:00
我没想过这种问题 但如果是我 我会考虑给一个dictionary<某种enum,object> 然后这个object 才是你的class要用的时候再转 每次更新时直接创新的class 不过这方法也不是很好 我觉得这个难题应该要先想清楚 为什么这个class会有这么高频的变动还不能用generic收纳这些变动 我自己是觉得有点怪 不过也可能我就真的刚好没遇到
楼主: s4300026 (s4300026)   2018-09-23 10:27:00
我觉得只要更新难免会多东西吧,要想怎么处理更新前的存盘
作者: jass970991 (半糖绿假面超人)   2018-09-23 11:12:00
主要是你这样更新 一开多条branch 开发 merge时就会爆炸了 所以我才会想说到底事需求真的这样 还是没考虑清楚
楼主: s4300026 (s4300026)   2018-09-23 11:17:00
我承认是我没有考虑清楚,原本就没有打算写给大程式,只想要几个简单的功能,没想到想要的东西越加越多
作者: jass970991 (半糖绿假面超人)   2018-09-23 11:19:00
那你要做的变更的数据形态可以做整合到同一个list或dic里吗? 这样未来会比较好处理如果是会有function增加的问题 建议把单纯的资料拉出来做成model 序列化model就好
楼主: s4300026 (s4300026)   2018-09-25 11:41:00
我知道了,简言之,就是存资料,不要存方法,这样我反而觉得我该走DB,而不是走序列化

Links booklink

Contact Us: admin [ a t ] ucptt.com