创建一个可序列化的对象,其中包含事件时
[Serializable]
public class NavCreat
{
///// <summary>
///// 当有值修改asm后, 触发该事件
///// </summary>
public event Action<List<Propertydata>> AsmChanged;
List<Propertydata> asm;
....
}
在二进制序列化保存时,总是报错,指示类Fshow无法序列化,而类Fshow恰好实现了对事件AsmChanged的实现.
而事件是不需要保存的,于是
[Serializable]
public event Action<List<Propertydata>> AsmChanged;
但是系统报错:
错误 1 特性“NonSerialized”在该声明类型中无效。它只在“field”声明中有效。
序列化操作代码如下:
using (Stream fStream = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite))
{
try
{
BinaryFormatter binFormat = new BinaryFormatter();//创建二进制序列化器
binFormat.Serialize(fStream, mo);
return new Tuple<bool, string>(true, "");
}
catch (Exception ex)
{
return new Tuple<bool, string>(false, "Serialize-无法存储指定文件" + Environment.NewLine + ex.ToString());
}
}
请问该如何解决这个问题呢?
------解决思路----------------------
错误就这一句话?能否看的再仔细点
------解决思路----------------------
试试fastCSharp
byte[] data = fastCSharp.emit.dataSerializer.Serialize(value);
------解决思路----------------------
NavCreat value = fastCSharp.emit.dataDeSerializer.DeSerialize<NavCreat>(data);
------解决思路----------------------
你可以按照楼上说的试验下
------解决思路----------------------
意思就是ZCL.DataTable.EWM.ffewmShow这个类型必须有[Serializable]
你序列化的对象类型,是不是这个类型,或是内部某个属性为这个类型,加上[NonSerialize]
------解决思路----------------------
没听说过什么“序列化事件”的概念。
贴出你这个想法的根据来。
------解决思路----------------------
你的 NonSerialized 到底在哪儿呢?你能不能先确认一下自己贴出来的东西?
------解决思路----------------------
是ZCL.DataTable.EWM.ffewmShow这个类没有标记为Serializable,和你的事件一点关系都没有
你的错误是:
------解决思路----------------------
这都是不认真看错误信息
既然错误信息提示你
ZCL.DataTable.EWM.ffewmShow”未标记为可序列化
那么你就应该去看ffewmShow到底怎么了
而不是去找别的类
那不成了瞎改一气
------解决思路----------------------
我今天也遇到了这个问题,序列化的类里面有事件,然后序列化时就提示引用过这个事件的类都必须要序列化,那肯定不行的。
不过我自己在网上找到方法了。
在你的事件上加 [field:NonSerializedAttribute()] 就可以取消对事件的序列化了
