- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试序列化下面提供的 QDatatables 类的实例,但出现错误:
System.Xml.dll 中出现“System.InvalidOperationException”类型的异常,但未在用户代码中处理附加信息:反射(reflect)类型“System.Collections.ObjectModel.ObservableCollection`1[DataRetrieval.Model.QDatatable]”时出现错误。
StackTrace:在 System.Xml.Serialization.XmlReflectionImporter.InitializeStructMembers(StructMapping 映射、StructModel 模型、 bool openModel、字符串类型名称、RecursionLimiter 限制器) 在 System.Xml.Serialization.XmlReflectionImporter.ImportStructLikeMapping(StructModel 模型、字符串 ns、 bool openModel、XmlAttributes a、RecursionLimiter 限制器) 在 System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping(TypeModel 模型、字符串 ns、ImportContext 上下文、字符串数据类型、XmlAttributes a、 bool 重复、 bool openModel、RecursionLimiter 限制器)
InnerException: {“System.Tuple`2[System.String,System.String] 无法序列化,因为它没有无参数构造函数。”
谁能帮忙找到丢失的东西?
我的序列化函数:
public string serialize()
{
StringWriter sw = new StringWriter();
XmlSerializer s = new XmlSerializer(this.GetType());
s.Serialize(sw, this);
return sw.ToString();
}
QDatatables 类:
[Serializable()]
public class QDatatables : BindableBase
{
private ObservableCollection<QDatatable> _list;
public ObservableCollection<QDatatable> List
{
get { return _list ?? (_list=new ObservableCollection<QDatatable>()); }
set { SetProperty(ref _list, value); }
}
public string serialize()
{
StringWriter sw = new StringWriter();
XmlSerializer s = new XmlSerializer(typeof(ObservableCollection<QDatatable>));
s.Serialize(sw, List);
return sw.ToString();
}
}
QDatatable 类
[Serializable()]
public class QDatatable : BindableBase
{
private int _id;
public int ID
{
get { return _id; }
set { SetProperty(ref _id, value); }
}
private String _name;
public String Name
{
get { return _name; }
set { SetProperty(ref _name, value); }
}
private WhereParams _params;
public WhereParams Params
{
get { return _params; }
set { SetProperty(ref _params, value); }
}
private bool _isexpanded;
public bool IsExpanded
{
get { return _isexpanded; }
set { SetProperty(ref _isexpanded, value); }
}
}
WhereParam类:
public class WhereParams : BindableBase
{
private Dictionary<int, WhereParam> _dictionaryIdToWhereParam;
private ObservableCollection<WhereParam> _list;
public ObservableCollection<WhereParam> List
{
get { return _list ?? (_list = new ObservableCollection<WhereParam>()); }
set { SetProperty(ref _list, value); }
}
public WhereParam GetById(int id)
{
return List.First(w => w.ID == id);
}
public string serialize()
{
StringWriter sw = new StringWriter();
XmlSerializer s = new XmlSerializer(this.GetType());
s.Serialize(sw, this);
return sw.ToString();
}
}
[Serializable()]
public class WhereParam:BindableBase
{
private int _id;
public int ID
{
get { return _id; }
set { SetProperty(ref _id, value); }
}
private string _name;
public string Name
{
get { return _name; }
set { SetProperty(ref _name, value); }
}
private ParamType _type;
public ParamType Type
{
get { return _type; }
set { SetProperty(ref _type, value); }
}
}
参数类型类:
[XmlInclude(typeof(DateTimeType))]
[XmlInclude(typeof(StringType))]
[XmlInclude(typeof(IntType))]
[XmlInclude(typeof(FloatgType))]
[XmlInclude(typeof(BoolType))]
[XmlInclude(typeof(NullableBoolType))]
[XmlInclude(typeof(ListMulti))]
[XmlInclude(typeof(ListSingle))]
[XmlInclude(typeof(StringMulti))]
public class ParamType: BindableBase
{
private int _typeID;
public int TypeID
{
get { return _typeID; }
set { SetProperty(ref _typeID, value); }
}
private ParamTypeEnum _typeName;
public ParamTypeEnum TypeName
{
get { return _typeName; }
set { SetProperty(ref _typeName, value); }
}
}
public class DateTimeType : ParamType
{
private DateTime? _datefrom;
public DateTime? Datefrom
{
get { return _datefrom; }
set { SetProperty(ref _datefrom, value); }
}
private DateTime? _dateTo;
public DateTime? DateTo
{
get { return _dateTo; }
set {
SetProperty(ref _dateTo, value); }
}
}
public class StringType : ParamType
{
private string _stringContent;
public string StringContent
{
get { return _stringContent; }
set {
SetProperty(ref _stringContent, value); }
}
}
public class IntType : ParamType
{
private int _intContent;
public int IntContent
{
get { return _intContent; }
set { SetProperty(ref _intContent, value); }
}
}
public class FloatgType : ParamType
{
private float _floatContent;
public float FloatContent
{
get { return _floatContent; }
set { SetProperty(ref _floatContent, value); }
}
}
public class BoolType : ParamType
{
private bool _boolTypeValue;
public bool BoolTypeValue
{
get { return _boolTypeValue; }
set { SetProperty(ref _boolTypeValue, value); }
}
}
public class NullableBoolType : ParamType
{
private bool? _nullableBoolTypeValue;
public bool? NullableBoolTypeValue
{
get { return _nullableBoolTypeValue; }
set { SetProperty(ref _nullableBoolTypeValue, value); }
}
}
public class ListMulti : ParamType
{
private ObservableCollection<Tuple<string, string>> _listMultiItems;
public ObservableCollection<Tuple<string, string>> ListMultiItems
{
get { return _listMultiItems; }
set { SetProperty(ref _listMultiItems, value); }
}
private ObservableCollection<Tuple<string, string>> _selectedListMulti;
public ObservableCollection<Tuple<string, string>> SelectedItemsListMulti
{
get { return _selectedListMulti ?? (_selectedListMulti = new ObservableCollection<Tuple<string,string>>()); }
set {
SetProperty(ref _selectedListMulti, value); }
}
}
public class ListSingle : ParamType
{
private ObservableCollection<Tuple<string, string>> _listSingleItems;
public ObservableCollection<Tuple<string, string>> ListSingleItems
{
get { return _listSingleItems; }
set { SetProperty(ref _listSingleItems, value); }
}
//private ObservableCollection<Tuple<string, string>> _listSingleItems;
//public ObservableCollection<Tuple<string, string>> ListSingleItems
//{
// get { return _listSingleItems; }
// set { SetProperty(ref _listSingleItems, value); }
//}
}
public class StringMulti : ParamType
{
private string _listMultiCollection;
public string ListMultiCollection
{
get { return _listMultiCollection; }
set { SetProperty(ref _listMultiCollection, value); }
}
}
public enum ParamTypeEnum
{
boolType,
nullableboolType,
intType,
floatType,
stringType,
datetimeType,
listmultiType,
stringlistmultiType,
};
最佳答案
问题是类Tuple<T1, T2>
, 被你的类(class)使用 ListMulti
其中,没有默认构造函数,因为元组只能通过 Tuple.Create()
公开创建. XmlSerializer
, 然而, requires classes to have parameterless default constructors如果遇到没有默认构造函数的类型,将抛出异常。这是您看到的异常。
一种解决方法是将代理属性添加到您的类中,以重新打包并以可序列化的形式返回其数据。然后,用 XmlIgnore
标记“真实”属性.对于 ListMulti
持有的字符串元组集合, 一个 string [][]
代理属性是有意义的:
public class ListMulti : ParamType
{
[XmlArray("ListMultiItems")]
[XmlArrayItem("Pair")]
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never), DebuggerBrowsable(DebuggerBrowsableState.Never)]
public string[][] SerializableListMultiItems
{
get
{
return ListMultiItems.ToPairArray();
}
set
{
ListMultiItems.SetFromPairArray(value);
}
}
[XmlArray("SelectedItemsListMulti")]
[XmlArrayItem("Pair")]
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never), DebuggerBrowsable(DebuggerBrowsableState.Never)]
public string[][] SerializableSelectedItemsListMulti
{
get
{
return SelectedItemsListMulti.ToPairArray();
}
set
{
SelectedItemsListMulti.SetFromPairArray(value);
}
}
private ObservableCollection<Tuple<string, string>> _listMultiItems = new ObservableCollection<Tuple<string, string>>();
[XmlIgnore]
public ObservableCollection<Tuple<string, string>> ListMultiItems
{
get { return _listMultiItems; }
set { SetProperty(ref _listMultiItems, value); }
}
private ObservableCollection<Tuple<string, string>> _selectedListMulti;
[XmlIgnore]
public ObservableCollection<Tuple<string, string>> SelectedItemsListMulti
{
get { return _selectedListMulti ?? (_selectedListMulti = new ObservableCollection<Tuple<string, string>>()); }
set
{
SetProperty(ref _selectedListMulti, value);
}
}
}
使用扩展方法:
public static class TupleExtensions
{
public static T[][] ToPairArray<T>(this IEnumerable<Tuple<T, T>> collection)
{
return collection == null ? null : collection.Select(t => new[] { t.Item1, t.Item2 }).ToArray();
}
public static void SetFromPairArray<T>(this ICollection<Tuple<T, T>> collection, T[][] array)
{
if (collection == null)
throw new ArgumentNullException();
collection.Clear();
foreach (var pair in array)
{
if (pair.Length != 2)
throw new ArgumentException("Inner array did not have length 2");
collection.Add(Tuple.Create(pair[0], pair[1]));
}
}
}
您需要对 ListSingle
进行类似的修复.
关于c# - 元组无法序列化,因为它没有无参数构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33225824/
谁能解释一下原因: (define a (lambda() (cons a #f))) (car (a)) ==> procedure ((car (a))) ==> (procedure . #f)
这是 PyBrain 网站的摘录。我了解大部分正在发生的事情,但是一行让我完全难住了。我以前从未在 python 代码中看到过这样的东西。这是整个循环,对于上下文: for c in [0,
我是gradle / groovy的新手。我想创建将做一些事情的自定义任务。我的第一个问题是任务完成时该如何做?我可以覆盖doFirst / doLast闭包吗?也许我可以重写某些在开始和结束时都会执
我刚刚开始评估 MS 企业库。他们使用以下指令来获取实例: var customerDb = EnterpriseLibraryContainer.Current.GetInstance("C
这是我的 if else Ansible 逻辑.. - name: Check certs exist stat: path=/etc/letsencrypt/live/{{ rootDomain
我正在使用construct 2.8 对一些失传已久的 Pascal 程序创建的一些文件的 header 进行逆向工程。 header 由许多不同的记录组成,其中一些是可选的,我不确定顺序是否固定。
我在将 getchar() 的输入放入 char *arr[] 数组时遇到问题。我这样做的原因是因为输入数据(将是一个带有命令行参数的文件)将存储在一个 char 指针数组中以传递给 execvp 函
通常我们不能约束类型参数 T派生自密封类型(例如 struct 类型)。这将毫无意义,因为只有一种类型适合,因此不需要泛型。所以约束如下: where T : string 或: where T :
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 9 年前。 Improve th
#include using namespace std; class A { private: int m_i; friend int main(int argc, char cons
这个问题在这里已经有了答案: Are there legitimate uses for JavaScript's "with" statement? (33 个答案) 关闭 9 年前。 我有这个代
在this answer我看到了下一个 Bash 结构。 yes "$(< file.txt)" 什么意思 "$(< file.txt)" ? 我明白了 命令替换 - $(command)用命令的结
if (a == 1) //do something else if (a == 2) //do something else if (a == 3) //do somethi
关于构造的快速简单的问题。 我有以下用于将项目添加到 ListView 的代码。 ListViewItem item = new ListViewItem(); item.Text = file; i
我想使用 std::vector 来控制给定的内存。首先,我很确定这不是好的做法,但好奇心占了上风,无论如何我都想知道如何做到这一点。 我遇到的问题是这样的方法: vector getRow(unsi
下面显示了一段简单的javascript: var mystring = ("random","ignored","text","h") + ("ello world") 这个字符串会生成 hello
在 Java 中,创建对象的标准方法是使用 MyClass name = new MyClass(); 我也经常看到构造 new MyClass() { /*stuff goes in here*/
我正在编写 C++ ndarray 类。我需要动态大小和编译时大小已知的数组(分别分配自由存储和分配堆栈)。我想支持从嵌套的 std::initializer_list 进行初始化。 动态大小的没问题
我正在将一个项目从 Visual Studio 2005 转换为 Visual Studio 2008,并提出了上述结构。 using Castle.Core.Resource; using Cast
我想知道我在这里的想法是否正确,我主要针对接口(interface)进行编程,所以我想知道下面的类是否应该通过 DI 注入(inject),或者我应该自己实例化一个类... 注意:这些服务保存在我的核
我是一名优秀的程序员,十分优秀!