繁体   English   中英

C#二进制序列化

[英]C# Binary Serialization

我正在尝试将对象序列化和反序列化到Byte数组以进行网络通信,我目前有一个接口'ISerialize'。 但是我认为应该有更强大的方法通过反射来做到这一点。

我使用BinaryFormater看了一下这个,但我看不出它是否会给我我需要的控件。

编辑:

我想能够将一个类装饰为Follows(其中字段可以是任何类型,只要它们是系统类型或者也是[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); 
}

其中所有字段都与网络顺序交换(bigendian)


我还希望将白名单字段序列化,而不是将那些不是黑名单。 所以问题是,我可以使用框架执行此操作,还是需要编写自己的实现?

听起来非常适合BinaryWriterBitConverter

BinarySerializer将完成所有这些以及更多。

我认为我最近放在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;
    }

看看protobuf-net 这是一个很棒的图书馆,可以完全按照自己的意愿行事。 它是第三方库,但它确实以明确定义的格式存储数据,这些格式可由C#和其他许多语言的其他库读取。

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

我自己用过它并且非常高兴。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM