,你可以:
public class Instruction
{
public OpCode Op { get; set; }
public string OpString
{
get
{
return Op.Name;
}
set
{
Op = (OpCode)typeof(OpCodes).GetField(value, BindingFlags.Static | BindingFlags.Public | BindingFlags.IgnoreCase).GetValue(null);
}
}
public object Operand { get; set; }
}
和禁用序列化Op
。通過這種方式,您可以序列化操作代碼(string
)的Name
,然後您就可以反序列化它。
隨着BinaryFormatter
您可以使用ISerializable
接口和手動序列化:使用
[Serializable]
public class Instruction : ISerializable
{
public OpCode Op { get; set; }
public object Operand { get; set; }
public Instruction()
{
}
public Instruction(SerializationInfo info, StreamingContext context)
{
Op = (OpCode)typeof(OpCodes).GetField(info.GetString("Op"), BindingFlags.Static | BindingFlags.Public | BindingFlags.IgnoreCase).GetValue(null);
Operand = info.GetValue("Operand", typeof(object));
}
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("Op", Op.Name);
info.AddValue("Operand", Operand);
}
}
例子:
var ins1 = new Instruction { Op = OpCodes.Add, Operand = (short)5 };
var ins2 = new Instruction { Op = OpCodes.Sub, Operand = 5.0 };
byte[] bytes;
using (var ms = new MemoryStream())
{
var bf = new BinaryFormatter();
bf.Serialize(ms, ins1);
bf.Serialize(ms, ins2);
bytes = ms.ToArray();
}
Instruction ins3, ins4;
using (var ms = new MemoryStream(bytes))
{
var bf = new BinaryFormatter();
ins3 = (Instruction)bf.Deserialize(ms);
ins4 = (Instruction)bf.Deserialize(ms);
}
如果Operand
可以的東西,是不能直接序列化,您可以創建它在GetObjectData
內的替代品。
但是當我需要該成員以備後用時,該怎麼辦? – user4653488
那麼,你不能序列化不可序列化的東西。如果不對這些類進行逆向工程,並且瞭解如何強制進行序列化,那麼沒有什麼可以做的。也許'OpCode'使用本地資源? –