C# Json反序列化 数据协定类型 无法反序列化 因为未找到必需的数据成员

背景今天在使用:C# Json 序列化与反序列化

反序列化的时候出现了下面的错误信息。

System.Runtime.Serialization.SerializationException: 数据协定类型“TestEntity”无法反序列化,因为未找到必需的数据成员“multipleChoice, runTimeDisplayColumns”。

在 System.ComponentModel.ReflectPropertyDescriptor.SetValue(Object component, Object value)

具体原因是:我在反序列化的实体类中新加了两个属性:

private bool multipleChoice;
        /// <summary>
        /// 帮助引擎是否允许多选
        /// </summary>
        [XmlIgnore]
        [Browsable(false)]
        public bool MultipleChoice
        {
            get
            {
                return multipleChoice;
            }
            set
            {
                multipleChoice = value;
            }
        }

        private string runTimeDisplayColumns;
        /// <summary>
        /// 帮助引擎运行时显示的列
        /// </summary>
        [XmlIgnore]
        [Browsable(false)]
        public string RunTimeDisplayColumns
        {
            get
            {
                return runTimeDisplayColumns;
            }
            set
            {
                runTimeDisplayColumns = value;
            }
        }

在使用之前保存的Json串反序列化的时候,新增的两个两个属性,没有对应的值,所以报出了上面的错误。

解决方法:

[DataContract]
public class TestEntity
{
		private bool multipleChoice;
        /// <summary>
        /// 帮助引擎是否允许多选
        /// </summary>
        [XmlIgnore]
        [Browsable(false)]
		[DataMember(IsRequired = false)]
        public bool MultipleChoice
        {
            get
            {
                return multipleChoice;
            }
            set
            {
                multipleChoice = value;
            }
        }

        private string runTimeDisplayColumns;
        /// <summary>
        /// 帮助引擎运行时显示的列
        /// </summary>
        [XmlIgnore]
        [Browsable(false)]
		[DataMember(IsRequired = false)]
        public string RunTimeDisplayColumns
        {
            get
            {
                return runTimeDisplayColumns;
            }
            set
            {
                runTimeDisplayColumns = value;
            }
        }
}

通过DataMember(IsRequired = false)属性表面此属性,不是必须的。这样的话,保证了在反序列化的时候,即使JSON串内缺少该属性的定义能正常反序列化。
小注:

在属性上添加DataMember(IsRequired = false)后,对应的类上必须添加 [DataContract]标识。

时间: 2024-11-16 00:30:31

C# Json反序列化 数据协定类型 无法反序列化 因为未找到必需的数据成员的相关文章

vb-VB显示未找到方法或数据成员

问题描述 VB显示未找到方法或数据成员 Private Sub Text1_click(Index As Integer) Dim mianji As Single mianji = 0.0061 * Form1.Text1.Text + 0.0128 * Form1.Text3.Text - 0.1529 Text1.Text = mianji FORM1中已经有了变量 解决方案 数据类型不对吧!文本框里面输入的是文字格式的,需要用到VAL函数来转换.

延时至调用时获取被反序列化数据的类型的实现

应用场景: 设计一个任务调度系统,配置信息以XML行式保存在Tasks.config的配置文件里,该配置里不止一个任务.不同的任务,会有不同配置信息与设定. 解决方案1:使用XPath直接读 优点:1. 直接:2. 灵活(配置可以千变万化) 缺点:1. 不友好,要写一堆的读取XML数据的方法,每次有新的任务时都要重写不同的XML片断:2. 容易出错,很有可能因为写了一个错误的节点属性名称而得不到数据 解决方案2:使用对象序列化成XML文档 缺点:1. 反序列化配置时必须有定义好的类型. 优点:1

ASP.NET 中JSON “.NET研究”的序列化和反序列化

JSON是专门为浏览器中的网页上运行的JavaScript代码而设计的一种数据格式.在网站应用中使用JSON的场景越来越多,本文介绍ASP.NET中JSON的序列化和反序列化,主要对JSON的简单介绍,ASP.NET如何序列化和反序列化的处理,在序列化和反序列化对日期时间.集合.字典的处理. 一.JSON简介 JSON(JavaScript Object Notation,JavaScript对象表示法)是一种轻量级的数据交换格式. JSON是"名值对"的集合.结构由大括号'{}',中

mongodb-MongoDB C# 驱动中结构类型无法反序列化

问题描述 MongoDB C# 驱动中结构类型无法反序列化 public class User { public Guid _id { get; set; } public Log L { get; set; } } public struct Log { [MongoDB.Bson.Serialization.Attributes.BsonDateTimeOptions(Kind=DateTimeKind.Local)] public DateTime CreateDateTime { get

在Struts中使用JavaBean和List(多行数据)类型属性

数据   在 Strust 中,我们可能经常要在 ActionForm 中使用其他 JavaBean 作为属性类型,这里就存在着如何使用好这些属性与 HTML Form 之间的数据交换,下面我们就这些问题做一讲解. 如在用户注册界面中,我们通常会将用户的联系方式形成一个单独的新的 Class ,如 Contact ,包含以下属性:电话 (tel) ,手机 (cell) , Email(email) , QQ(qq) ,通信地址 (adress) 等等,这样条理也比较清晰,以下是这个 Action

Oracle 9i的数据表类型

表7.5 Oracle 9i的数据表类型 方式 特点 关系表 默认的表类型,存储永久性的数据,可以被分区,这样可以改善表的性能并易于管理 临时表 存储私有数据或一个会话中特定的数据,数据库中的其他用户不能使用这些数据 索引表 按照结构化主关键字进行排序的方式存储数据,和关系表不同的是不能把表和主关键字分开存储 外部表 数据存储在Oracle数据库外部的文件中,只能读,因此任何索引都不能存储在外部表中 对象表 支持面向对象的数据表

C++的数据与类型

一.前言 最近在看C++Primer第5版,先前已经看过第4版,但是发现第5版在整个知识布局与个别知识的讲解上跟第4版差别还是挺大的,尤其是新增了C++11的内容,正如孟岩老师在第5版前言中所讲:"现在能够以新的C++11风格开发实践的人是凤毛麟角,如果能够纯熟的运用C++11的新特征.新机制,那么就能够形成一种简洁优雅的C++编程风络,开发会变得更高效,更高质". 所以正好借助第5版来重新学习巩固C++的知识.<C++的那些事>这个系列,将会以知识碎片的形式记录我在学习过

为何汇编的数据无类型

大家都知道汇编有byte,word,dword,fword,tword等等类型,可是为什么常说汇编数据无类型呢?这是因为在汇编编程里面,这些数据类型都是可以互转的,比如说,word就是两个byte,如果定义了worddata dw 100 dup(?),那么使用的时候就可以把它当成byte来使用,如invoke wsprintf,offset worddata,offset keyword,100.其它的如local rect:RECT,其实可以把它当成byte缓冲来使用,如: lea esi,

数据类型-c语言中,二进制文件中怎样判断的各个数据的类型

问题描述 c语言中,二进制文件中怎样判断的各个数据的类型 我有一个二进制文件,包含各种数字,stirng char.但是我不知道里面的各个数据的类型,只知道各个数据的名字.然后怎么判断各个数据的类型.(比如 8bit 的 char, 16 bit 的 boolean 之类的)然后再转成要求的数据类型输出(printf). 我打算先用fread一条一条读取这些文件到结构体数组中,.主要问题是我不知道各个数据的类型,用不了fread!!! 老师给的提示是说,先把二进制文件转成十六进制或其他格式 查看