无法加载进行反序列化所需的类型

jetsteven 2009-02-26 10:03:38
自已编写的组件 ,在winForm引用后, 给一个公共属性,赋值List<FieldEntity>后, 保存再打开就显示如下信息.
无法加载进行反序列化所需的类型 System.Collections.Generic.List`1[[QGrid.QGrid+FieldEntity, QGrid, Version=1.0.0.3, Culture=neutral, PublicKeyToken=null]]。

QGrid
以下是引用类型的代码

[Serializable]
public class FieldEntity : ISerializable
{


private string _fieldname;
private string _fieldvalue;
private Boolean selected;

public FieldEntity(){}



protected FieldEntity(SerializationInfo info, StreamingContext context)
{
this._fieldname = info.GetString("FieldName");
this._fieldvalue = info.GetString("FieldValue");
this.selected = info.GetBoolean("Selected");

}
public FieldEntity(string fieldname, Boolean selected)
{
this.FieldName = fieldname;
this.Selected = selected;
this.FieldValue = "";
}

public FieldEntity(string fieldname,string fieldvalue, Boolean selected)
{
this.FieldName = fieldname;
this.Selected = selected;
this.FieldValue = fieldname;
}


public string FieldName
{
set { _fieldname = value; }
get { return _fieldname; }
}

public string FieldValue
{
set { _fieldvalue = value; }
get { return _fieldvalue; }
}

public Boolean Selected
{
set { selected = value; }
get { return selected; }
}

#region ISerializable 成员

void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("FieldName", this.FieldName);
info.AddValue("FieldValue", this.FieldValue);
info.AddValue("Selected", this.selected);
}

#endregion
}


...全文
2071 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
tanktang811010 2012-02-28
  • 打赏
  • 举报
回复
楼主可以看下:里面有解决方案
http://stackoverflow.com/questions/2568623/when-i-renamed-a-class-i-am-getting-a-deserialization-error-how-to-fix-it
言多必失 2011-09-20
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 jetsteven 的回复:]
类型“QGrid.QGrid+FieldEntity[]”的对象无法转换为类型“QGrid.QGrid+FieldEntity[]”。

如果不想在,设计时,实例化组件自动成属性.
需要在属性上加如下代码.
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
[/Quote]

原来我也见过这样的代码不知道什么意思,没有关注,现在遇到和你一样的问题。谢谢给出答案。
jetsteven 2009-03-04
  • 打赏
  • 举报
回复
类型“QGrid.QGrid+FieldEntity[]”的对象无法转换为类型“QGrid.QGrid+FieldEntity[]”。

如果不想在,设计时,实例化组件自动成属性.
需要在属性上加如下代码.
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]

jetsteven 2009-02-27
  • 打赏
  • 举报
回复
我的QGrid里有以下属性:

private List<FieldEntity> disableColumn = new List<FieldEntity>();
private List<FieldEntity> invisibleColumn = new List<FieldEntity>();

/// <summary>
/// 禁用列
/// </summary>
[Description("禁用的列"), Editor(typeof(FaceEditor), typeof(UITypeEditor))]
public List<FieldEntity> DisableColumnList
{
set { this.disableColumn = value; }
get { return this.disableColumn; }

}
/// <summary>
/// 可显列
/// </summary>
[Description("不需显示的列"), Editor(typeof(FaceEditor), typeof(UITypeEditor))]
public List<FieldEntity> InvisibleColumnList
{
set { this.invisibleColumn = value; }
get { return this.invisibleColumn; }

}


现在发现, 在设计时候,如果重新编译Qgrid, 那么引用它的Form,打开时,会显示.
类型“QGrid.QGrid+FieldEntity[]”的对象无法转换为类型“QGrid.QGrid+FieldEntity[]”。
既然是同一个对象,为什么还会无法转换呢.

现在只要关闭,再重新打开VS2008, 双击form,就会正常显示,点击DisableColumnList属性会显示FaceEditor(列Fieldentity).双击resx文件里会出现

qGrid1.DisableColumnList System.Collections.Generic.List`1[[QGrid.QGrid+FieldEntity (无法显示值)

这是正确的.因为是一个list<FieldEntity>对象,当然(无法显示值).

如果只是关闭解决方案, 重新打开.那么resx文件里是
qGrid1.DisableColumnList null null

那么为什么我只要一编译组件,就会生成qGrid1.DisableColumnList null null这样呢, 查看resx源代码, 是二进制码啊.

<data name="qGrid1.InvisibleColumnList" mimetype="application/x-microsoft.net.object.binary.base64">
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAADxRR3JpZCw
</value>
</data>


综上,难道是bug?!

整整困扰了我二天, 今天早上打项目时,突然发现好了, 然后重新编译又出问题 ,找了一天,总以为是序列和反序列的问题,甚至想放弃使用对象List<FieldEntity>改用string来解决,但又不甘.

 后来想想,既然找到对象,说明是序列是没有问题. 

一开始(无法加载进行反序列化所需的类型 ) 与这也有关系.
jetsteven 2009-02-27
  • 打赏
  • 举报
回复
序列化和反序列化是windows自己处理,后生成在resx文件

我是做的一个组件设计.QGrid 中有一个DisableColumnList 的属性. 在设计界面时,点击这项, 会弹出一个FORM(ColumnSelectEditorForm), ColumnSelectEditorForm操作后会返回一个LIST<FieldEntity>. Windows会自动把数据保存到xxx.resx.

我能看到数据如下
AAEAAAD/////AQAAAAAAAAAMAgAAADxRR3JpZCwgVmVyc2lvbj0xLjAuMC4zLCBDdWx0dXJlPW5ldXRy

在xxx这个form的Desinger.cs中

this.qGrid1.DisableColumnList = ((System.Collections.Generic.List<QGrid.QGrid.FieldEntity>)(resources.GetObject("qGrid1.DisableColumnList")));

是能过这个来读取.
我在调试是,能读到this.qGrid1.DisableColumnList , 它的值是有的, 而且和我当时操作保存的结果是一致的.

是不是resources.GetObject("qGrid1.DisableColumnList")有问题?

whycom 2009-02-26
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 king19840811 的回复:]
System.Collections.Generic.List`1[[
List <FieldEntity>
泛型不支持序列化的?你这样用不行
[serializable]
public FieldEntityList:List <FieldEntity>
{
}
这样用FieldEntityList来操作
[/Quote]
楼上说的不对list<>支持序列化,你在同一个函数内序列化和反序列化,看成不成成功,

ps:贴出你的序列化和反序列化的代码
cppfaq 2009-02-26
  • 打赏
  • 举报
回复
给一个公共属性,赋值List <FieldEntity>

这种操作尽量在
if(!DesignMode)
{
// 给一个公共属性,赋值List <FieldEntity>
}

中进行
king19840811 2009-02-26
  • 打赏
  • 举报
回复
System.Collections.Generic.List`1[[
List <FieldEntity>
泛型不支持序列化的?你这样用不行
[serializable]
public FieldEntityList:List<FieldEntity>
{
}
这样用FieldEntityList来操作
jetsteven 2009-02-26
  • 打赏
  • 举报
回复
都在同一项目,所有不存在程序集的问题.

关键是 "无法加载进行反序列化所需的类型 " 这个类型就是FieldEntity的一个LIST. 我在设计界面赋值后, 查看resx文件,发现值,是空的. 那么就是说明序列化没有成功.

是不是单个FieldEntity是可以的, List<fieldEntity>就不行了.
whycom 2009-02-26
  • 打赏
  • 举报
回复
保证序列化和反序列化的程序,使用同一程序集

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧