我正在编写代码来进行Xml序列化.具有以下功能.
public static string SerializeToXml(object obj)
{
XmlSerializer serializer = new XmlSerializer(obj.GetType());
using (StringWriter writer = new StringWriter())
{
serializer.Serialize(writer, obj);
return writer.ToString();
}
}
Run Code Online (Sandbox Code Playgroud)
如果参数是没有无参数构造函数的类的实例,它将抛出异常.
未处理的异常:System.InvalidOperationException:CSharpConsole.Foo无法序列化,因为它没有无参数构造函数.System.Xml.Serialization.ModelScope.GetTypeModel的System.Xml.Serialization.TypeScope.GetTypeDesc(Type type,MemberInfo sourc e,Boolean directReference,Boolean throwOnError)中的System.Xml.Serialization.TypeDesc.CheckSupported()处于类型类型, System.Xml.Serialization上的System.Xml.Serialization.XmlSerializer..ctor(Type type,String defaultName space)中System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping(Type type,XmlRootAttribute root,String defaultNamespace)的布尔直接引用. XmlSerializer..ctor(类型类型)
为什么必须有一个无参数构造函数才能使xml序列化成功?
编辑:感谢cfeduke的回答.无参数构造函数可以是私有的或内部的.
如果我定义了一个类
[DataContract()]
class MyObject {
[DataMember()]
ImmutableList<string> Strings { get; private set}
}
Run Code Online (Sandbox Code Playgroud)
该ImmutableList<T>类型来自immutables库https://www.nuget.org/packages/Microsoft.Bcl.Immutable.请注意,类ImmutableList没有默认构造函数或可变的Add方法.将内容添加到列表中即可获取表单.
myList = myList.Add("new string");
Run Code Online (Sandbox Code Playgroud)
我是否可以为.NET序列化机制添加一些自定义支持以支持此类型并向其显示如何对其进行反序列化?
目前,在反序列化时只会跳过该集合,尽管可以将其序列化.
我打算在项目中使用多个名称索引字典.我的第一选择是使用一个string键,它只是我Value元素的Name属性.
但是,即使它们访问不同类型,这也会使字典键完全相同:
private Dictionary<string, Foo> myFoos;
private Dictionary<string, Bar> myBars;
myFoos[bar.Name]; // shouldn't be able to do this!
Run Code Online (Sandbox Code Playgroud)
我希望密钥彼此不兼容,使它们无法互相混淆:
private Dictionary<FooName, Foo> myFoos;
private Dictionary<BarName, Bar> myBars;
Run Code Online (Sandbox Code Playgroud)
由于*Name为每种Value类型创建一个类是过度的,我创建了一个Name<T>类:
public struct Name<T>
{
public string Name;
// for convenience, could be explicit instead
static implicit operator string(Name<T> name)
{
return name.Name;
}
}
Run Code Online (Sandbox Code Playgroud)
这会给我
private Dictionary<Name<Foo>, Foo> myFoos;
private Dictionary<Name<Bar>, Bar> myBars;
Run Code Online (Sandbox Code Playgroud)
然后我可以存储Name<Foo>实例而不是字符串.
这看起来有点笨拙,但这是迄今为止我提出的最好的 - 有关如何做得更好的任何建议吗?
这是误导,还是很棒?