是否可以将 C# 结构体之类的联合序列化为 XML?

2024-03-02

假设我有这个简单的(类似联合)C# 结构

[StructLayout(LayoutKind.Explicit)]
public struct MyData
{
    [FieldOffset(0)]
    public int Num;
    [FieldOffset(0)]
    public int Number;
    [FieldOffset(4)]
    public string Name;
    [FieldOffset(4)]
    public string Url;
};

以及使用 XmlSerializer 和 StreamWriter 的保存方法

static void SaveToXml(object obj, string fileName)
{
    XmlSerializer writer = new XmlSerializer(obj.GetType());
    using (StreamWriter file = new StreamWriter(fileName))
    {
        writer.Serialize(file, obj);
    }
}

因此,如果我们放入一些数据并保存它:

MyData md = new MyData();
md.Name = "Ilan_01";
md.Num = 1;
SaveToXml(md, @"C:\temp\data.xml");

XML 文件看起来像这样:

<?xml version="1.0" encoding="utf-8"?>
<MyData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Num>1</Num>
  <Number>1</Number>
  <Name>Ilan_01</Name>
  <Url>Ilan_01</Url>
</MyData>

有可能让它看起来像这样(使用相同或相似的方法)吗?

<?xml version="1.0" encoding="utf-8"?>
<MyData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Num>1</Num>
  <Name>Ilan_01</Name>
</MyData>

EDIT

另一方面,如果我们设置这些数据:

md = new MyData();
md.Url = "127.0.0.1";
md.Number = 2;

我希望看到这个 XML 的结果。

<?xml version="1.0" encoding="utf-8"?>
<MyData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Number>2</Number>
  <Url>127.0.0.1</Url>
</MyData>

So the XmlIgnore属性不是我要找的。

这只是一个简单的例子,真正的实现是使用不同类型(相同大小)的其他结构。

End Edit

谢谢,伊兰


这并不完全是您想要的,但可以扩展以满足您的需求,原始代码来自 msdn 上的某个地方,恐怕不记得在哪里了。我确信必须有一种更优雅的方法来执行此操作(即在 MyData 的成员上有一个自定义属性),但我不知道:

public struct MyData
{
    public int Num;
    public int Number;
    public string Name;
    public string Url;
};

class XMLIgnore
{
    static void SaveToXml(MyData obj)
    {
        XmlSerializer writer2 = customserialiser(obj);
        writer2.Serialize(Console.Out, obj);
    }

    static public XmlSerializer customserialiser(MyData d)
    {
        XmlAttributes attrs = new XmlAttributes();
        attrs.XmlIgnore = true;
        XmlAttributeOverrides xmlOveride = new XmlAttributeOverrides();

        if( d.Name.Length != 0 )
            xmlOveride.Add(typeof(MyData), "Url", attrs);
        else
            xmlOveride.Add(typeof(MyData), "Name", attrs);

        if (d.Num != 0)
            xmlOveride.Add(typeof(MyData), "Number", attrs);
        else
            xmlOveride.Add(typeof(MyData), "Num", attrs);

        return new XmlSerializer(typeof(MyData), xmlOveride);
    }

    public static void go()
    {
        MyData d = new MyData();
        d.Num = 1;
        d.Number = 2;
        d.Name = "John";
        d.Url = "Happy";
        SaveToXml(d);

        Console.WriteLine();
        Console.WriteLine();

        MyData d2 = new MyData();
        d2.Num = 0;
        d2.Number = 2;
        d2.Name = "";
        d2.Url = "Happy";
        SaveToXml(d2);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否可以将 C# 结构体之类的联合序列化为 XML? 的相关文章

随机推荐