相关疑难解决方法(0)

如何使用.NET XmlSerializer使值类型为空?

让我们假设我有这个对象:

[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(零)时.


看起来你必须实现自定义序列化.

是的,那也是我的意思,但我想在没有它的情况下逃脱.

在应用程序中,对象要复杂得多,我不想自己处理序列化.

c# null xml-serialization value-type

29
推荐指数
3
解决办法
3万
查看次数

连载bool?错误反映类型

我有一个类似的课程

   [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来克服反射误差.谢谢.

c# xml xml-serialization

11
推荐指数
1
解决办法
6696
查看次数

XmlSerializer可以反序列化为Nullable <int>吗?

我想反序列化包含可以标记nil="true"为具有类型属性的类的元素的XML消息int?.我能让它工作的唯一方法是编写我自己的NullableInt实现类型IXmlSerializable.有没有更好的方法呢?

我写了完整的问题以及我在博客上解决它的方式.

nullable xml-serialization xml-nil

8
推荐指数
1
解决办法
8670
查看次数

如何反序列化 Nullable&lt;bool&gt;?

我正在尝试Nullable<bool>从我的 XML 文件中反序列化 a 。我的期望是在我的 XMLElement 中找不到的 XMLAttribute 是null,如果找到,它将是truefalse。序列化也一样。如果它不为空,我的变量将被写入。

无论如何,每次我试图反序列化我的 XML 时,InvalidOperationException都会被抛出。

我的班级看起来像这样

[XMLArray("Users")]
public class User
{
    [XMLAttribute("copy")]
    public bool? copy;
}
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

c# xml nullable xml-deserialization

2
推荐指数
1
解决办法
6247
查看次数

为什么将XML反序列化为Object返回null值?

我有一个像这样的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)

.net c# xml serialization object

0
推荐指数
1
解决办法
6367
查看次数