让我们假设我有这个对象:
[Serializable]
public class MyClass
{
public int Age { get; set; }
public int MyClassB { get; set; }
}
[Serializable]
public class MyClassB
{
public int RandomNumber { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
XmlSerializer会像这样序列化对象:
<MyClass>
<Age>0</age>
<MyClassB>
<RandomNumber>4234</RandomNumber>
</MyClassB>
</MyClass>
Run Code Online (Sandbox Code Playgroud)
我怎样才能使该物业成为可空?IE:当它低于0时,没有序列化属性Age?
我尝试使用Nullable,但它将我的对象序列化为:
<MyClass>
<Age d5p1:nil="true" />
<MyClassB>
<RandomNumber>4234</RandomNumber>
</MyClassB>
</MyClass>
Run Code Online (Sandbox Code Playgroud)
通过阅读MSDN文档,我发现了这个:
您不能将IsNullable属性应用于键入为值类型的成员,因为值类型不能包含nullNothingnullptra null引用(在Visual Basic中为Nothing).此外,对于可空值类型,您不能将此属性设置为false.当这些类型为nullNothingnullptra null引用(在Visual Basic中为Nothing)时,它们将通过将xsi:nil设置为true来序列化.
来源:http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlelementattribute.isnullable.aspx
我理解值类型不能设置为null.值类型始终设置为某个值.序列化不能根据它的当前值决定是否序列化它.
我尝试了属性,但它没有成功.我尝试创建一个agecontainer对象并使用属性操作它的序列化,但它没有成功.
我真正想要的是:
<MyClass>
<MyClassB>
<RandomNumber>4234</RandomNumber>
</MyClassB>
</MyClass>
Run Code Online (Sandbox Code Playgroud)
当属性Age低于0(零)时.
看起来你必须实现自定义序列化.
是的,那也是我的意思,但我想在没有它的情况下逃脱.
在应用程序中,对象要复杂得多,我不想自己处理序列化.
我有一个类似的课程
[Serializable]
public class MyClass
{
[XmlAttribute]
public bool myBool { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
但是当xml中不存在该属性时,这会将bool的值序列化为false.当属性不在xml中时,我希望该属性为null.
所以我试过这个
[Serializable]
public class MyClass
{
[XmlAttribute]
public bool? myBool { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
但随后序列化错误
Type t = Type.GetType("Assembly.NameSpace.MyClass");
XmlSerializer mySerializer = new XmlSerializer(t); //error "There was an error reflecting type"
Run Code Online (Sandbox Code Playgroud)
请举个例子,我可以做到这一点.我知道在SO上有一些相关的问题,但没有任何东西能说明如何用可空的bool来克服反射误差.谢谢.
我想反序列化包含可以标记nil="true"为具有类型属性的类的元素的XML消息int?.我能让它工作的唯一方法是编写我自己的NullableInt实现类型IXmlSerializable.有没有更好的方法呢?
我写了完整的问题以及我在博客上解决它的方式.
我正在尝试Nullable<bool>从我的 XML 文件中反序列化 a 。我的期望是在我的 XMLElement 中找不到的 XMLAttribute 是null,如果找到,它将是true或false。序列化也一样。如果它不为空,我的变量将被写入。
无论如何,每次我试图反序列化我的 XML 时,InvalidOperationException都会被抛出。
我的班级看起来像这样
[XMLArray("Users")]
public class User
{
[XMLAttribute("copy")]
public bool? copy;
}
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
我有一个像这样的XML字符串:
<?xml version="1.0" ?>
<result>
<vmeet_id>7121</vmeet_id>
<username>MT_Hue_QuangBinh_QuangTri</username>
<email></email>
<begin_date>2010-04-21 08:53</begin_date>
<expiry_date>2010-12-21 00:00</expiry_date>
<point></point>
<info>OK</info>
</result>
Run Code Online (Sandbox Code Playgroud)
我想将它反序列化为一个对象,所以我创建了这个类:
[Serializable]
[XmlRoot(ElementName = "result", IsNullable = false)]
public class UserInfo
{
[XmlAttribute("vmeet_id")]
public int UserID { get; set; }
[XmlAttribute("username")]
public string Username { get; set; }
[XmlAttribute("email")]
public string Email { get; set; }
[XmlAttribute("begin_date")]
public DateTime BeginDate { get; set; }
[XmlAttribute("expiry_date")]
public DateTime ExpiryDate { get; set; }
[XmlAttribute("point")]
public string Point { get; set; }
[XmlAttribute("info")]
public string Info { …Run Code Online (Sandbox Code Playgroud)