1

我一直在元编程的上下文中尝试使用 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();
    }
4

1 回答 1

4

解决方案不可序列化,并且不会很快出现。

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

于 2013-05-21T21:40:10.230 回答