未标记为可序列化错误

时间:2017-10-06 07:11:17

标签: c# serialization binary-serialization

我有一个班级'实体'

[Serializable]
public class Entity
{
   public Guid Id { get; set; }
   public IEnumerable<Entity> ChildEntity { get; set; } 
}

我会注意到它有属性ChildEntity,它是同一个类Entity的列表。

问题1。我是否必须明确序列化此列表?或者类上的Serializable属性将为我工作。

现在,当我尝试使用二进制序列化程序对此类进行序列化时,我得到一个例外,即此类未标记为Serializable。

我认为在尝试序列化childEntities时会发生异常。

这是我的序列化代码。

public static T DeepClone<T>(T obj)
{
    using (var ms = new MemoryStream())
    {
        var formatter = new BinaryFormatter();

        try
        {
            formatter.Serialize(ms, obj);
        }
        catch (Exception Ex)
        {
           //TODO
    }
    }
}

我还有一个类来填充实体类列表。

[Serializable]
public class AllEntity
{
    public Guid ParentId {get; set; }
    public Guid Id {get; set;} //childId
    public string Desc {get; set;}
}

我正在执行递归以基于父子关系构建实体列表。

public IEnumerable<Entity> Build(IEnumerable<AllEntity> allentity)
{
    //recursivey builds List if Entity class
}

异常消息:

  

类型   &#39; System.LINQ.Enumerable + WhereSelectListIterator`2 [[Common.Models.AllEntity,   Common,Version = 1.0.0.0,Culture = neutral,Token = null],   [Common.Models.Entity,Common,Version = 1.0.0.0,Culture = neutral,   标记=空]&#39;在Assembly&System; System.Core,Version = 4.0.0.0,   文化=中立,Token = null&#39;未标记为可序列化

2 个答案:

答案 0 :(得分:1)

如异常所示,您的问题是,在至少一个Entity实例中,属性IEnumerable<Entity> ChildEntity实际上并未引用List<ChildEntity>,它指的是未评估的结果一个.Where()。 LINQ查询。

在存储之前使用ToList()实现它。

答案 1 :(得分:0)

我已使用以下代码检查其工作正常。

Entity ea = new Entity();
ea.Id = Guid.NewGuid();
var li = new List<Entity>();
li.Add(new Entity { Id = Guid.NewGuid() });
ea.ChildEntity = li;
DeepClone<Entity>(ea);

您需要将类标记为[Serializable]。