邀朋友种豆,一起分享吧
喜欢购买正品行货?那就去品牌街

UserControl XXXX无标记为序列化的原因及解决办法

来自:种豆 时间:2017-12-29 阅读:4157次 原文链接

自定义 UserControl 中包含封装了 List <接口> 类型字段的属性,编译后造成引用了该 UserControl 的窗体设计器无法显示!提示“System.Runtime.Serialization.SerializationException :程序集"XXX,Version 1.0.0.0,  Culture = neutral, PublicKeyToken = null "中的类型“XXX.YYYY”未标记为可序列化”示例代码如下:

public partial class MyUserControl : UserControl
{
public MyUserControl()
{
InitializeComponent();
m_ReceiverList
= new List<DuxUser>();
}
public MyUserControl(List<DuxUser> receiverlist)
{
InitializeComponent();
m_ReceiverList
= receiverlist;
}
#region Properties
private List<DuxUser> m_ReceiverList=null;
public List<DuxUser> ReceiverList
{
get { return m_ReceiverList; }
set
{
m_ReceiverList
= value;
}
}
#endregion
}

public class DuxUser //定义的一个DuxUser类
{
public DuxUser() { }
}

这个MyUserControl代码看起来时没有任何问题的,但是只要你往窗体上一拖就是报上面红色字体的错误,如果你是写代码添加到窗体上是不会出错的,只要拖到窗体上去就会报错!为什么会这样呢?

UserControl XXXX无标记为序列化的原因

例如: 把一个MyUserControl控件拖到一个Form1上,那么Form1.Designer.cs里就会出现这么一条代码:

this.myUserControl1.ReceiverList = ((System.Collections.Generic.List<DuxUser>)(resources.GetObject("myUserControl1.ReceiverList")));

这段代码就是错误的根源,因为DuxUser类没有标记为可序列化 [Serializable],所以List<DuxUser>也就不能序列化啦!

为什么Form1.Designer.cs中会有那么一段代码呢,原因在MyUserControl的无参数构造函数上:

m_ReceiverList = new List<DuxUser>();

我们在做集合的时候,一般都会给他实例化一下,这样可以避免调用控件的集合Add() 或者 Remove,foreach 等操作的时候出现Null值异常!

但是就是这段代码,Form1.Designer.cs文件中自动生成了那么一段怪代码,导致出错。

UserControl XXXX无标记为序列化的解决办法

1、把DuxUser类,标记为可序列化的类[Serializable],示例如下,此时上述描述窗口中显示这段代码:this.myUserControl1.ReceiverList = ((System.Collections.Generic.List<DuxUser>)(resources.GetObject("myUserControl1.ReceiverList")));[Serializable]
public class DuxUser
{
public DuxUser() { }
//.........
}
2、代码做如下更改
private List<DuxUser> m_ReceiverList=null;
[Bindable(
false), Browsable(false)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public List<DuxUser> ReceiverList
{
get { return m_ReceiverList; }
set
{
m_ReceiverList
= value;
}
}

3、无参数构造方法中 m_ReceiverList=null 或者不写; 然后再Load事件中进行初始化),那么在Form1.Designer.cs中看到的就是this.ReceiverList = null;    需要注意的是:Load事件中要判断集合是否为null值,是null才去初始化,因为有可能是手动写代码添加到容器(如:窗体),而不是拖,写代码的方式有可能在Load之前给集合属性赋值
上述内容整理自 wxm3630478 的博客文章。


 
关于种豆 ┊ 联系我们 ┊ 免责声明 ┊ 发帖须知 ┊ 请提意见 ┊ 站点地图
本站为个人爱好兴趣分享网站,不代表本人观点,如有侵权请联系QQ3033380280进行处理
sowsoy.com 版权所有 Copyright©2010-2021 备案号:蜀ICP备2020025376号-3
Email:sowsoy#hotmail.com