C# 二进制序列化

3
我正在尝试将对象序列化和反序列化为字节数组以进行网络通信,我目前有一个名为“ISerialize”的接口。然而,我在思考是否可以通过反射更稳健地实现这一点。
我已经研究了一下使用BinaryFormater来做这件事情,但我无法确定它是否会给我所需的控制权。
编辑:我想要将一个类装饰成如下形式(其中字段可以是任何类型,只要它们是系统类型或也是[Serializable])
[Serializable]
public class MyClass {

    [NonSerialized]
    SomeOtherClass _classFeild;

    [Position (0)]
    UInt16 _field1;

    [Position (14)]
    UInt32 _feild2;

    //..........
}

并且具有以下功能:
void Test () {
    MyObject = new MyClass ();
    Byte[] raw;
    raw  =  Serializer.Serialize (MyClass); // Results in _field1 at raw[0,1]
                                            //            _field2 at raw[14-18]

    MyClass Deserialized  = Serializer.Deserialize<MyClass> (raw); 
}

所有字段都会被转换为网络字节序(大端序)。


我更喜欢将要序列化的字段列入白名单,而不是列出不需要序列化的黑名单。所以问题是,我能否使用框架来实现这个功能,还是需要编写自己的实现?


请将以下与编程有关的内容从英语翻译为中文。仅返回已翻译的文本: Python是一种高级编程语言,通常用于数据分析和计算科学领域。它具有简洁易读的语法和强大的库,如NumPy和Pandas,可帮助用户处理和分析大量数据。Python还可以用于Web开发、游戏编程和人工智能等其他领域。 - Marc Gravell
谢谢你的输入,不过还是感谢:D - user164771
4个回答

3

我不确定BinaryWriter是否提供我所需要的功能(请参见我的编辑)。实际上,我正在使用ToHostOrder中的BitConverter。 - user164771
在你的DeSerialize示例中,为什么不使用BitConverter.ToUInt32而是进行位移操作呢? - sipsorcery
没有逻辑上的原因,这是我从VB6移植过来时的遗留问题,当时我没有想到在那种情况下使用BitConverter。 - user164771

2

0

我认为我最近在Github上发布的项目可能非常适合你。我声称它将是可用的最快的二进制序列化程序,并且它没有任何开销。每个属性都直接由其二进制值表示。

请查看:https://github.com/Toxantron/CGbR#binary-datacontract-serializer

目前输入是DataContract和DataMember属性。

[DataContract]
public partial class Root
{
    [DataMember]
    public int Number { get; set; }

    [DataMember]
    public Partial[] Partials { get; set; }

    [DataMember]
    public IList<ulong> Numbers { get; set; }
}

以及生成器输出

    public byte[] ToBytes(byte[] bytes, ref int index)
    {
        // Convert Number
        Buffer.BlockCopy(BitConverter.GetBytes(Number), 0, bytes, index, 4);;
        index += 4;
        // Convert Partials
        // Two bytes length information for each dimension
        Buffer.BlockCopy(BitConverter.GetBytes((ushort)(Partials == null ? 0 : Partials.Length)), 0, bytes, index, 2);
        index += 2;
        foreach(var value in Partials ?? Enumerable.Empty<Partial>())
        {
            value.ToBytes(bytes, ref index);
        }
        // Convert Numbers
        // Two bytes length information for each dimension
        Buffer.BlockCopy(BitConverter.GetBytes((ushort)(Numbers == null ? 0 : Numbers.Count)), 0, bytes, index, 2);
        index += 2;
        foreach(var value in Numbers ?? Enumerable.Empty<ulong>())
        {
            Buffer.BlockCopy(BitConverter.GetBytes(value), 0, bytes, index, 8);;
            index += 8;
        }
        return bytes;
    }

0

看一下protobuf-net。它是一个非常适合你所需的库。虽然它是第三方库,但它可以将数据存储在一个明确定义的格式中,这个格式可以被其他C#和许多其他语言的库读取。

这里是如何使用它的示例:http://code.google.com/p/protobuf-net/wiki/GettingStarted

我自己用过它,感觉很不错。


我在其他几个项目中使用了protobuf。不幸的是,我正在与之通信的接口在其方式上相当固定。(C风格结构体) - user164771

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接