【问题标题】:Serialize and Deserialize (C#)序列化和反序列化 (C#)
【发布时间】:2011-12-18 11:18:22
【问题描述】:

如何像这样将一个类反序列化为另一个类:

var ser = SerializedObject(b);// read from Database!

var des = DeSerializeAnObject(ser, typeof(BaseClass));

BaseClass baseclass = (BaseClass)des;

baseclass.Hello();

【问题讨论】:

    标签: c# serialization deserialization


    【解决方案1】:

    您确定您真正追求的是序列化/反序列化吗?在我看来,您正在寻找的是将一个对象映射(即复制选定或所有属性)到另一个对象的代码。

    看看AutoMapper Getting Started Guide

    按照你的例子,你可以做这样的事情

    BaseClass baseClass = Mapper.Map<OtherClass, BaseClass>(b);
    

    我也对您在示例中选择的类名感到有些困惑。如果“BaseClass”确实是 OtherClass 的基类,那么您只需进行强制转换,但我猜情况并非如此。

    【讨论】:

    • 假设我没有其他类,(只有序列化的类在数据库中)。我想从序列化对象中执行 Hello()。对不起,我的英语不好。
    • @AhmadAhmadi 你的意思是其他进程/系统正在将你未知类型的对象序列化到数据库中,而你希望反序列化它们吗?
    • 是的,我必须反序列化它们并执行方法。
    • @AhmadAhmadi 那么恐怕你就不走运了。序列化只会持久化序列化实例的实例字段,而不是方法体。您在数据库中的数据根本不包含足够的信息。您需要(在运行时)访问类定义才能将您的数据反序列化为任何有用的东西。
    【解决方案2】:

    反序列化样本就像...

        public BaseClass DeSerializeAnObject(BaseClass bc)
        {
            if (bc == null) return bc;
    
            IFormatter formatter = new BinaryFormatter();
            using (Stream stream = new MemoryStream())
            {
                formatter.Serialize(stream, bc);
                stream.Seek(0, SeekOrigin.Begin);
                return (BaseClass)formatter.Deserialize(stream);
            }
        }
    

    【讨论】:

      猜你喜欢
      • 2012-02-02
      • 2013-10-12
      • 2011-05-12
      • 2012-03-17
      • 2014-01-06
      • 1970-01-01
      相关资源
      最近更新 更多