最佳(和快速)方式进行序列化和放大为什么我的StructLayout使代码崩溃?

时间:2015-06-21 17:54:51

标签: c# serialization

我编写了一些支持快速序列化和反序列化的抽象类。 我将StructLayout添加到实现类中,然后崩溃了(没有StructLayout它没有崩溃)

我有2个问题

  1. 是否有更好的方式来进行序列化(在此我在TotalMilliseconds中进行序列化= 0.4834并使用.net的标准方式我需要TotalMilliseconds = 2.120)?
  2. 为什么'StructLayout'崩溃了我的代码(运行应用程序开始时运行时的异常
  3. {“无法从程序集'WindowsFormsApplication4,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null'加载类型'WindowsFormsApplication4.Element1',因为格式无效。”:“WindowsFormsApplication4.Element1”}

    代码

    public abstract class SerializeElement
    {
        public abstract void Serialize(BinaryWriter bw);
        public abstract void DeSerialize(BinaryReader br);
    
        public sealed byte[] Serialize()
        {
            byte[] retVal = null;
    
            using(MemoryStream ms = new MemoryStream())
            {
                using(BinaryWriter bw = new BinaryWriter(ms))
                {
                    Serialize(bw);
                    retVal = ms.GetBuffer();
                }
            }
    
            return retVal;
        }
    
        public sealed void DeSerialize()
        {
            byte[] retVal = null;
    
            using(MemoryStream ms = new MemoryStream())
            {
                using(BinaryReader br = new BinaryReader(ms))
                {
                    DeSerialize(br); 
                }
            }
        }
    }
    
    
    [StructLayout(LayoutKind.Sequential, Pack=4)]
    public class Element1 : SerializeElement 
    {
        public int Var1 { get; set; }
        public int Var2 { get; set; }
    
        public override void Serialize(BinaryWriter bw)
        {
            bw.Write(Var1);
            bw.Write(Var2);
        }
    
        public override void DeSerialize(BinaryReader br)
        {
            Var1 = br.ReadInt32();
            Var2 = br.ReadInt32();
        }
    }
    
    
        static void Main()
        {
            Element1 e = new Element1()
            {
                Var1 = 1,
                Var2 = 2
            };
    
            var tt = e.Serialize();
    

2 个答案:

答案 0 :(得分:1)

好的,经过一些测试后,我发现.Net并不喜欢Element1在应用SerializeElement属性时继承StructLayout的事实。

当我评论继承自SerializeElement时,程序运行正常。因此,我建议您创建一个Data Transfer Object来封装Element1使用的属性并使用StructLayout属性。然后,提供对继承SerializeElement的类的转换,以便您可以序列化和反序列化该值。

您需要确保输出格式正确,但这不应该是一个太大的问题。

BinaryWriter是最快的解决方案而言,我会 assume BinaryWriter是对Stream的简单抽象,它仅提供用于将值转换为int / float / double /等的实用程序。值。但是,重要的是要知道何时需要最快的解决方案。一次又一次,我们(程序员)发现有时最快的解决方案并不是最好的解决方案。通常,速度与发展速度和质量的权衡是值得的。

话虽如此,我建议(as would others)尝试使用protobuf-net。它非常快,并且(在我看来)通用串行器的好处远远超过必须为每个单个类编写自定义序列化器。

答案 1 :(得分:1)

有时答案只需点击一下...... StructLayout定义不会提供继承选项

enter image description here