【问题标题】:different way to use binary Serialisation使用二进制序列化的不同方式
【发布时间】:2014-05-30 13:47:27
【问题描述】:

我想序列化一个我没有源代码的类, 有没有办法对这个在 C# 中没有 Attribute Serializable 的类进行二进制序列化?

我正在使用 microsoft 类来做到这一点 http://msdn.microsoft.com/en-us/library/4abbf6k0(v=vs.110).aspx

【问题讨论】:

  • 有人可以在投反对票之前发表评论吗?我可以以正确的方式编辑我的问题

标签: c# serialization binary


【解决方案1】:

如果没有 [Serializable] 属性,您将无法进行二进制序列化,至少不能使用默认机制。

您可以进行 XmlSerialization,或通过反射创建自定义序列化过程。

编辑我想到了一个技巧,不确定它是否会起作用

也许你可以使用谷歌的协议缓冲区来实现它,让我解释一下。

Google 有一个非常轻巧且快速的序列化库,称为协议缓冲区,这是 .net 实现:https://code.google.com/p/protobuf-net/

如果你创建一个封装目标类的类,我相信(不是 100% 肯定)它会序列化它。

假设您要序列化的类名为 ClasToSer,那么您可以像这样创建一个类:

[ProtoContract]
public class Encapsulator
{
    [ProtoMember(1)]
    public ClasToSer RealData{ get; set; };    

}

然后就可以用这个类进行序列化和反序列化了:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.IO;
using ProtoBuf;

public static class ProtoBuffHelper
{

    public static byte[] Serialize<T>(T Objeto)
    {

        MemoryStream ms = new MemoryStream();
        Serializer.Serialize<T>(ms, Objeto);
        byte[] data = ms.ToArray();
        ms.Dispose();
        return data;

    }


    public static T Deserialize<T>(byte[] Datos)
    {

        MemoryStream ms = new MemoryStream(Datos);
        T inst = Serializer.Deserialize<T>(ms);
        ms.Dispose();
        return inst;

    }
}

试一试,如果有效,请告诉我。

【讨论】:

  • 我尝试序列化的类已经可以在xml中序列化,但我尝试减小文件大小和处理时间
  • 使用反射我不知道该怎么做,但我可能有一个层 api 可以做到这一点
  • 不,没有,通过反射你可以枚举一个类的所有属性,然后获取它的值并保存为二进制数据,但这是一个非常难和长的代码(但你也会得到非常紧凑的数据)
猜你喜欢
  • 2010-10-05
  • 1970-01-01
  • 2014-01-04
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多