[c#]二进制反序列化问题求助

问题描述

问题描述如下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#的是正解,直接替换类型参数的命名空间和名字

时间: 2024-08-30 17:26:48

[c#]二进制反序列化问题求助的相关文章

二进制-初学C……求助float有效数字的问题

问题描述 初学C--求助float有效数字的问题 关于浮点数有效数字我有很多疑惑,我发现我读入一个浮点数后再输出,两个数字是不相等的.开始我以为是我输入的数字超过了float有效数字位数的原因,但是下面这个程序证明不是这个原因: #include <stdio.h>#include <float.h>int main(void){float test;char data[7];printf(""Float has at least %d effective nu

在 WCF 中使用高效的 BinaryFormatter 序列化

本文将定义一个 WCF 终结点行为扩展,以在 WCF 中使用更高效的 BinaryFormatter 进行二进制序列化,并实现对是否使用传统二进制序列化功能的可配置. 介绍 实现步骤 使用方法 效果   介绍 在 OEA 框架中,是使用 WCF 作为数据传输框架.但是使用 WCF 内部的二进制序列化,序列化后的数据大小,要比使用传统的 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter 类进行序列化后的数据大小要大得多.作

二进制-求助,怎么将编码结果用 bit 位存到文件中

问题描述 求助,怎么将编码结果用 bit 位存到文件中 对一篇英文文章出现的字符进行Huffman编码,然后要将编码表和英文文章保存到文件中,编码结果必须是二进制形式,即0和1要用bit位表示,不能用字符'0'和'1'表示 解决方案 计算机最小单位是字节 8位 解决方案二: 我知道啊,所以不能用字符型的,要用bit位啊 解决方案三: 文件可以在打开时,以二进制的形式打开. if( (fp=fopen(filename,"wb"))== NULL ) { printf("Can

对象的序列化与反序列化,以xml,二进制流的方式,soap方式序列化对象

  System.Runtime.Serialization.Formatters.Soap 命名空间包含SoapFormatter 类,该类用于以SOAP 格式将对象序列化和反序列化.生成使用此命名空间中的类型的应用程序时,必须引用System.Runtime.Serialization.Formatters.Soap.dll 程序集.   using System;using System.Drawing;using System.Collections;using System.Windo

代码-如何用VC读取注册表二进制值,比如ShutdownTime?求助~

问题描述 如何用VC读取注册表二进制值,比如ShutdownTime?求助~ 用RegQueryValueEx读取数据,应该放在哪种数据类型中呢,求有效代码~ 下面这段是自己的提取TypedURLsTime的代码.不知问题在哪.. int main() { HKEY hKey; DWORD lpType = REG_BINARY; BYTE time[64]; DWORD timeSize = sizeof(time); RegOpenKeyEx(HKEY_CURRENT_USER, "Soft

二进制流“0”不包含有效的 BinaryHeader。这可能是由于无效流,或由于在序列化和反序列化之间的对象版本更改

问题描述 二进制流"0"不包含有效的BinaryHeader.这可能是由于无效流,或由于在序列化和反序列化之间的对象版本更改怎么解决啊 解决方案 解决方案二:可能解析这个流的软件需要一个BinaryHeader,也就是流中前几个对于内容来说无用的,只是用来说明流类型的byte[]解决方案三:不是很明白.能说的清除些吗?解决方案四:code?解决方案五:取单步跟踪你的代码,答案就在其中解决方案六:兄弟这个问题解决了吗,能给点提示不,我现在也遇到这个问题

Java,C#使用二进制序列化、反序列化操作数据_java

java使用二进制序列化.反序列化的操作首先,要引入java.io下面相关包,或者直接写import java.io.*; 下面,为了书写操作的方便,采用复制文件,和throws声明异常的方式来写 复制代码 代码如下: public void test6() throws IOException { byte[] b = new byte[1024];//定义字节数组,缓冲 FileInputStream in = new FileInputStream("E:\\logo.gif")

急,MySql数据库对于二进制转为流然后反序列化怎么操作??

问题描述 publicDictionary<string,Model.Operator>GetAllOperatorInfo(){//SQL命令stringsqltxt="SelectId,OperatorName,Password,RightsList,StateFromOperator";//创建操作员实体集合Dictionary<string,Model.Operator>operatorCollection=newDictionary<string

求助~怎么将得到的二进制图片插入到现有的xml文件中

问题描述 RT先有一个问题,需要根据xml中的一个字段值,从数据库中得到二进制图片,怎么在xml中显示这个二进制图片??? 解决方案 解决方案二: 解决方案三:是在我现有的xml文件中怎么显示我得到的二进制图片...不是生成二进制流解决方案四:图片只能在网页上显示吧解决方案五:对啊,上面所述:stringbase64String=Convert.ToBase64String(bytes,0,bytes.Length);Image1.ImageUrl="data:image/png;base64,