5

我正在尝试用 C# 编写一个用于书籍导入工具的 ONIX。我首先使用 Xsd2Code 创建类,并获得了一个包含所有属性的巨大文件,经过一些调整后在反序列化时不会产生任何错误。

我试图一次将整个元素反序列化为内存中的一个大对象,然后对其进行处理(例如将其保存到数据库)。

Xsd2Code 生成类的方式,除了有很多属性之外,至少对我来说有点奇怪。

这是应该是 Product 对象的属性的类之一:

public partial class NotificationType
{
    public NotificationTypeRefname refname { get; set; }
    public NotificationTypeShortname shortname { get; set; }

    public SourceTypeCode sourcetype { get; set; }

    public List1 Value { get; set; }
}

我想请您注意这一行:

    public List1 Value { get; set; }

“List1”是一个枚举,定义如下:

public enum List1
{
    [System.Xml.Serialization.XmlEnum("01")]
    Item01,

    [System.Xml.Serialization.XmlEnum("02")]
    Item02, etc...

我的问题是,在反序列化期间,所有字段都正确反序列化,但枚举除外。

我尝试用 XmlEnum("NotificationType") 等装饰属性......什么都没有!

这是我的反序列化代码:

var p = new Product();
XmlSerializer pserializer = new XmlSerializer(p.GetType());
object pDeserialized = pserializer.Deserialize(reader);
p = (Product) pDeserialized;

这是这个元素在 XML 中的样子:

<NotificationType>03</NotificationType>

Product 对象在 C# 中的属性是:

public NotificationType NotificationType { get; set; }

如果我将其更改为:

public List1 NotificationType { get; set; }

反序列化正确显示“Item03”,这意味着它确实读取了 XML 中的任何内容。如果我像上面那样保留它,NotificationType 类的“Value”属性永远不会被填充,并且总是显示 Item01(Enum 的默认值)。

关于为什么这个 Value 属性适用于某些类型(字符串)但不适用于枚举,我已经用尽了关于 SO 和网络搜索的所有可能问题。我错过了什么吗?

对不起,很长的问题和代码。感谢任何人都可以在这个问题上阐明的任何观点。现在已经坚持了一整天了。

4

2 回答 2

2

尝试这个:

public partial class NotificationType
{
    public NotificationTypeRefname refname { get; set; }
    public NotificationTypeShortname shortname { get; set; }
    public SourceTypeCode sourcetype { get; set; }

    public List1 Value { get {
        return (List1)Enum.Parse(typeof(List1), 
            Enum.GetName(typeof(List1), int.Parse(List1Value) - 1));
    }}

    [XmlText]
    public string List1Value { get; set; }
}

[更新]

自从:

  1. 我也尝试过首先用XmlText属性装饰成员,但是发生了以下异常:

    无法序列化“ConsoleApplication1.NotificationType”类型的对象。考虑将 XmlText 成员“ConsoleApplication1.NotificationType.Value”的类型从 ConsoleApplication1.List1 更改为字符串或字符串数​​组。

  2. 并且您想避免我在答案中的初始方法,

真正的解决方案是,除了将XmlText属性应用于之外Value,所有其他成员都应该用XmlIgnoreAttribute. 我相信XmlText单独使用不是一个有保证的解决方案,因为结果取决于其他成员的存在。

public class NotificationType
{
    [XmlIgnore] // required
    public NotificationTypeRefname refname { get; set; }
    [XmlIgnore] // required
    public NotificationTypeShortname shortname { get; set; }
    [XmlIgnore] // required
    public SourceTypeCode sourcetype { get; set; }

    [XmlText] // required
    public List1 Value { get; set; }
}
于 2013-02-21T13:22:52.583 回答
1

尝试添加[System.Xml.Serialization.XmlTextAttribute()]public List1 Value { get; set; }属性。

于 2013-02-21T13:27:36.533 回答