序列化的解决方案-罗斯林CTP3



我一直在元编程上下文中使用Roslyn进行实验,但是在将ISolution或IProject对象持久化到数据库时遇到了困难。以下是我试图将ISolution对象序列化为字节数组,然后返回到对象的内容。我碰到了类未被标记为可序列化的异常。我愿意接受任何关于这个问题的想法,如果我的方式不对,请尽管说。

更新:我需要将这些项目序列化到数据库的原因涉及到遗传编程的实验。基本上,你可以改变一个解决方案,或者稍微改变一下项目,然后测试新修改的程序,如果它在测试阶段表现良好,那么将修改后的程序用于下一代。不幸的是,将所有这些对象一直保存在内存中有点不切实际。停电是保持这些实体状态的一个很好的理由,还有其他理由。所以我不一定需要把这些东西序列化成字节,我只需要保存最少量的信息,以便在需要的时候重建这些对象。然而,我不确定最有效的方式来实现我的最终目标。

public static object ByteArrayToObject(this byte[] arrBytes)
    {
        MemoryStream serializationStream = new MemoryStream();
        BinaryFormatter formatter = new BinaryFormatter();
        serializationStream.Write(arrBytes, 0, arrBytes.Length);
        serializationStream.Seek(0L, SeekOrigin.Begin);
        return formatter.Deserialize(serializationStream);
    }
    public static byte[] ObjectToByteArray(this object obj)
    {
        if (obj == null)
        {
            return null;
        }
        BinaryFormatter formatter = new BinaryFormatter();
        MemoryStream serializationStream = new MemoryStream();
        formatter.Serialize(serializationStream, obj);
        return serializationStream.ToArray();
    }

解决方案是不可序列化的,短期内也不会。

对于您的场景,最好的方法可能是简单地序列化您所更改的文件的新文本。如果真的想节省空间,您甚至可以存储文本的一部分。Roslyn中的syntaxtree可以序列化为二进制流并返回,但我们发现这对于大多数场景来说都是多余的。syntaxtree已经有一种自然的序列化格式——文本,您可以简单地重新解析以获得返回的结果文本。

最新更新