我编写了一些支持快速序列化和反序列化的抽象类。 我将StructLayout添加到实现类中,然后崩溃了(没有StructLayout它没有崩溃)
我有2个问题
{“无法从程序集'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();
答案 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定义不会提供继承选项