【问题标题】:How to serialize database first EF5 object to Byte array?如何将数据库第一个 EF5 对象序列化为字节数组?
【发布时间】:2014-12-12 14:06:13
【问题描述】:

如何最好地将 Entity Framework 对象序列化为字节数组(以便可以将其缓存在 redis 中)?

序列化通常需要将属性添加到属性中,但是因为这个项目首先是 DB,所以由于代码生成,我无法添加属性(而且我不确定在没有 .NET 的情况下如何说我想要序列化由于遍历嵌套集合而试图序列化整个数据库)。

希望实现的目标是:

Product product;
using(var context = new MyContext())
{
product = new ProductRepository(context).GetItem(123456);
}

byte[] productSerialized = Serialize(product);

repo 加载的任何内容都将被序列化,而未加载的内容将被忽略。如果我能接近这个,那就太好了。

【问题讨论】:

  • 您的课程将生成为partial 以解决此类问题。只需在另一个文件中添加属性即可。
  • 另一种选择是不序列化 EF 对象,但具有易于来回转换的 DTO 对象 - entitiestodtos.codeplex.com
  • @BenRobinson 我不知道 partials 可以做到这一点。不过,嵌套集合的数量可能仍然是个问题。

标签: c# entity-framework serialization


【解决方案1】:

如果您的 Product 是一个结构,那么这可能会对您有所帮助:

    public byte[] Serialize(Product p)
    {
        var size = Marshal.SizeOf(typeof(Product));
        // Both managed and unmanaged buffers required.
        var bytes = new byte[size];
        var ptr = Marshal.AllocHGlobal(size);
        // Copy object byte-to-byte to unmanaged memory.
        Marshal.StructureToPtr(p, ptr, false);
        // Copy data from unmanaged memory to managed buffer.
        Marshal.Copy(ptr, bytes, 0, size);
        // Release unmanaged memory.
        Marshal.FreeHGlobal(ptr);
        return bytes;
    }

【讨论】:

  • 它不适用于课程。但是您的课程非常复杂,如何将Serialize() 成员添加到Product,将您的所有属性/字段转换为字节数组并将它们连接到一个大byte[](使用BitConverter)?还是您的代码如此动态以至于无法做到这一点?
  • 因为一切都如此集成,我不认为这是可以做到的。听上去,我需要一个“CachableProduct”类,并进行一些改造
【解决方案2】:

您可以使用 MemoryStream 并获取其缓冲区,如下所示:

    public byte[] Serialize(Product product)
    {
        MemoryStream stream = new MemoryStream();
        XmlSerializer serializer = new XmlSerializer(typeof(Product)); 
        serializer.Serialize(stream, product);
        return stream.GetBuffer();
    }

【讨论】:

  • 我遇到的问题(我在帖子中提到过)是由于代码生成,我无法添加[Serializable]属性。当我更新数据库时,所有的类文件都会重新生成。
  • 因此您可以使用 XmlSerializer。那个不需要您的 Product 类具有属性。答案将被编辑(抱歉;我没有正确阅读)。
  • 更进一步,但它试图序列化每个属性 - 是否加载。加上一些属性进入一个接口,导致序列化失败。
  • XmlSerializer 序列化每个公共属性。也许将这些属性设为私有;不知道它会如何工作。也可以通过属性抑制单个公共属性的序列化,但您已经说过这是不可能的。
猜你喜欢
  • 2015-06-03
  • 2013-04-29
  • 2014-09-02
  • 2012-10-24
  • 2021-05-25
  • 2014-12-07
  • 2016-04-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多