【问题标题】:Compatibility of .NET Framework and Core BinaryFormatter.NET Framework 和 Core BinaryFormatter 的兼容性
【发布时间】:2018-03-07 12:29:26
【问题描述】:

我想知道使用 .NET Framework BinaryFormatter 序列化的对象是否可以使用 .NET Core BinaryFormatter 反序列化,反之亦然。

这些格式在多大程度上兼容?

上下文:我正在将旧应用程序的一部分移植到 .NET Core,并且此代码使用 BinaryFormatter 来执行不再受支持的 .NET Remoting。所以我想知道如何替换对象的序列化。初步试验表明,有时可以使用 BinaryFormatter (这很好,因为这样我的代码更改较少),在其他情况下,反序列化失败并出现看似随机的错误消息,例如“无根对象”或“类型需要实现 IConvertible”,这似乎表明格式不兼容。

在这个 SO 问题中,我试图了解格式在多大程度上兼容,看看是否有简单的解决方法,而不是完全切换到另一种序列化技术/框架。

【问题讨论】:

  • 这很容易测试。使用两个格式化程序序列化相同的对象并比较二进制文件。他们是一样的吗?它们有何不同?运行时版本只是几个字节还是有更显着的差异? 什么你序列化?如果类发生了变化,它们的序列化形式也会有所不同。 Type needs to implement IConvertible 之类的错误指的是程序的类型,而不是格式。
  • 如果格式相同,则可能是 BinaryFormatter like this one 中的错误。该线程中的人将二进制文件序列化为 Base64 以便比较它们。
  • 如果将使用 BinaryFormatter 的代码放入 .NET Standard 库并与两个框架共享会发生什么?
  • 正如我所说,我已经有几个有效的案例和一些无效的案例。我正在与 SO 联系,以寻找已经知道答案的人,而不是对 BinaryFormatter 进行逆向工程。此外,像 IConvertible 这样的错误可能是由于反序列化器的随机状态,因为格式已更改。我的应用程序共享完全相同的代码,因此课程当然没有改变。
  • SO 不是 CoreFX 团队或 docs.microsoft.com。如果您有示例将它们发布在问题本身中。当您不提供任何东西时,谁能提供帮助?

标签: c# serialization .net-core binary-serialization


【解决方案1】:

在我的情况下,.net 核心无法识别 .net 框架中的列表(我的意思是列表将为空),反之亦然。我正在考虑使用 Newtonsoft.Json。

通常,当您创建 ASP.NET MVC 项目时,会自动安装 Newtonsoft.Json。

我在 .net core 中序列化以下内容:

SubtitlesAnalysis ana = GetAnalysis();
string output = Newtonsoft.Json.JsonConvert.SerializeObject(input);
File.WriteAllText(@"D:\1.json", output);

我在 .net 框架中反序列化它:

var input = File.ReadAllText("D:\1.json");       
var ana = Newtonsoft.Json.JsonConvert.DeserializeObject<SubtitlesAnalysis>(input);

类字幕分析:

    [Serializable()]
    public class SubtitlesAnalysis
    {
        public int WordCountOfBasic
        {
            get
            {
                return WordCountsByDifficulty[1];
            }
        }

        public int WordCountOfCet4
        {
            get
            {
                return WordCountsByDifficulty[2];
            }
        }

        public int WordCountOfCet6
        {
            get
            {
                return WordCountsByDifficulty[3];
            }
        }

        public int WordCountOfIeltsOrTofel
        {
            get
            {
                return WordCountsByDifficulty[4];
            }
        }

        public int WordCountOfGre
        {
            get
            {
                return WordCountsByDifficulty[5];
            }
        }

        public int WordCountOfGrePlus
        {
            get
            {
                return WordCountsByDifficulty[6];
            }
        }

        public int WordCount
        {
            get
            {
                return WordCountsByDifficulty[1] + WordCountsByDifficulty[2] + WordCountsByDifficulty[3] + WordCountsByDifficulty[4] + WordCountsByDifficulty[5] + WordCountsByDifficulty[6];
            }
        }

        private int[] _WordCountsByDifficulty = new int[8];
        public int[] WordCountsByDifficulty
        {
            get
            {
                return _WordCountsByDifficulty;
            }
        }

        public int IdiomCount { get; set; }
        public int Speed { get; set; }
        public TimeSpan Length { get; set; }
        public TimeSpan DialogueTime { get; set; }
        public List<WordIdWithContext> WordAndContext { get; set; } = new List<WordIdWithContext>();
        public List<WordIdWithContext> IdiomAndContext { get; set; } = new List<WordIdWithContext>();
        public List<WordWithContext> UnrecognisedWordsWithContext { get; set; } = new List<WordWithContext>();

        public SubtitlesAnalysis()
        {
        }
    }

【讨论】:

  • JSON 不是二进制格式,因此它没有回答与二进制格式化程序中的二进制序列化具有相同功能的问题..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-04
  • 2020-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多