问题描述
问题描述如下1我编写了一个数据结构,简单的list,然后list的填充的也是自己编写的一个class,生成了对应的dll。最后将这个lis用t二进制序列化。2新建一个解决方案编写反序列化的程序,该调用了之前数据结构生成的dll。同时因为一些需要,我在新的解决方案中也重新实现了之前的数据结构,并添加了个方法。3想将原来的二进制数据,转化为在新解决方案中编写的数据结构。4我的尝试——我使用SerializationBinder(见下面代码)将list的类型成功的重新定位了,但是list的内容却无法再次重新指向新编写的数据结构。5我的问题,怎么才能用SerializationBinder实现我的类型转化需求。//这里是序列化内容的实现,我序列化的是一个list,但是list的内容是我自己写的一个classusingSystem;usingSystem.Collections.Generic;usingSystem.IO;usingSystem.Text;usingSystem.Runtime.Serialization.Formatters.Binary;namespaceSerializeTest{//classSerializeMain//{//staticvoidMain(string[]args)//{//ListTestlt=newListTest();//Aa1=newA();//a1.a="a1";//Aa2=newA();//a2.a="a2";//lt.list.Add(a1);//lt.list.Add(a2);//FileStreamfileStream=newFileStream(@"C:UsersAADesktopexceltesttestList.dat",FileMode.Create);//BinaryFormatterb=newBinaryFormatter();//b.Serialize(fileStream,lt);//fileStream.Close();//}//}[Serializable]classListTest{publicList<A>list=newList<A>();}[Serializable]classA{publicstringa="aaaaaaa";}}
usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.IO;usingSystem.Runtime.Serialization.Formatters.Binary;usingSystem.Runtime.Serialization;usingSystem.Reflection;//usingDataStructure;namespacetestForUnknow.deser{//这里是我自己重新编写的数据结构[Serializable]classListTest{publicList<A>list=newList<A>();}[Serializable]classA{publicstringa="aaaaaaa";publicstaticvoidgo(){//dosomething}}classdeserTest{publicstaticvoidMain(){objectinstance=null;FileStreamfs=newFileStream(@"C:UsersAADesktopexceltesttestList.dat",FileMode.Open);BinaryFormatterbinFormat=newBinaryFormatter();myBindermb=newmyBinder();binFormat.Binder=mb;instance=binFormat.Deserialize(fs);System.Console.ReadLine();}}//这里使用反序列化的方式重新定位类型,但是list的内容没有被成功定位还是指向之前的SerializeTest.ApublicsealedclassmyBinder:SerializationBinder{publicoverrideTypeBindToType(stringassemblyName,stringtypeName){TypetypeToDeserialize=null;string[]temp=typeName.Split('.');stringusertype="testForUnknow.deser."+temp[1];Assemblyass=Assembly.GetExecutingAssembly();typeToDeserialize=ass.GetType(usertype);returntypeToDeserialize;}}}
解决方案
解决方案二:
Type.GetType(typeName.Replace("SerializeTest","testForUnknow.deser"));
解决方案三:
你重新绑定的是SerializeTest但之前序列化的却是List<SerializeTest>,根本不是一种类型你应该重新绑定至List<新类型>,也就是publicoverrideTypeBindToType(stringassemblyName,stringtypeName)应该返回的是List<typeName>这样的泛型类型,写成类型名就是"System.Collections.Generic.List`1[namepsapce.typeName]"http://stackoverflow.com/questions/5794686/serializationbinder-with-listt/16657484这个贴子里更进了一步,加了个Dictionary来缓存已用过的类型,提升性能
解决方案四:
1#的是正解,直接替换类型参数的命名空间和名字