当前位置: 代码迷 >> C# >> 二进制序列化跟事件的冲突
  详细解决方案

二进制序列化跟事件的冲突

热度:84   发布时间:2016-05-05 02:59:45.0
二进制序列化和事件的冲突!
创建一个可序列化的对象,其中包含事件时

    [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());
                }
            }


请问该如何解决这个问题呢?
------解决思路----------------------
引用
指示类Fshow无法序列化

错误就这一句话?能否看的再仔细点
------解决思路----------------------
试试fastCSharp
            byte[] data = fastCSharp.emit.dataSerializer.Serialize(value);

------解决思路----------------------
            NavCreat value = fastCSharp.emit.dataDeSerializer.DeSerialize<NavCreat>(data);

------解决思路----------------------
你可以按照楼上说的试验下
------解决思路----------------------
引用
ZCL.DataTable.EWM.ffewmShow”未标记为可序列化。

意思就是ZCL.DataTable.EWM.ffewmShow这个类型必须有[Serializable]
你序列化的对象类型,是不是这个类型,或是内部某个属性为这个类型,加上[NonSerialize]
------解决思路----------------------
引用:
创建一个可序列化的对象,其中包含事件时


没听说过什么“序列化事件”的概念。

贴出你这个想法的根据来。
------解决思路----------------------
引用:
而事件是不需要保存的,于是

[Serializable]
public event Action<List<Propertydata>> AsmChanged;


但是系统报错: 

错误 1 特性“NonSerialized”在该声明类型中无效。它只在“field”声明中有效。


你的 NonSerialized 到底在哪儿呢?你能不能先确认一下自己贴出来的东西?
------解决思路----------------------
是ZCL.DataTable.EWM.ffewmShow这个类没有标记为Serializable,和你的事件一点关系都没有
你的错误是:
引用
ZCL.DataTable.EWM.ffewmShow”未标记为可序列化。

------解决思路----------------------
这都是不认真看错误信息
既然错误信息提示你
ZCL.DataTable.EWM.ffewmShow”未标记为可序列化
那么你就应该去看ffewmShow到底怎么了
而不是去找别的类
那不成了瞎改一气
------解决思路----------------------
我今天也遇到了这个问题,序列化的类里面有事件,然后序列化时就提示引用过这个事件的类都必须要序列化,那肯定不行的。
不过我自己在网上找到方法了。
在你的事件上加 [field:NonSerializedAttribute()] 就可以取消对事件的序列化了

  相关解决方案