自已编写的组件 ,在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
}
无法加载进行反序列化所需的类型 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
}
List <FieldEntity>
泛型不支持序列化的?你这样用不行
[serializable]
public FieldEntityList:List<FieldEntity>
{
}
这样用FieldEntityList来操作
{
// 给一个公共属性,赋值List <FieldEntity>
}
中进行
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")有问题?
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来解决,但又不甘. 后来想想,既然找到对象,说明是序列是没有问题. 一开始(无法加载进行反序列化所需的类型 ) 与这也有关系.
需要在属性上加如下代码.
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
http://stackoverflow.com/questions/2568623/when-i-renamed-a-class-i-am-getting-a-deserialization-error-how-to-fix-it