.NET Framework与Core BinaryFormatter

时间:2018-03-07 12:29:27

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

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

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

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

在这个问题中,我试图了解格式兼容的程度,看看是否可以轻松解决这些问题,而不是完全切换到另一个序列化技术/框架。

1 个答案:

答案 0 :(得分:0)

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

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

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

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()
        {
        }
    }