gpt4 book ai didi

c# - 是否可以将像 C# struct 这样的联合序列化为 XML?

转载 作者:太空宇宙 更新时间:2023-11-03 11:38:57 27 4
gpt4 key购买 nike

假设我有这个简单的(类似联合的)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>

编辑

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

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>

所以 XmlIgnore属性不是我要找的。

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

结束编辑

谢谢,伊兰

最佳答案

这不是您想要的,但可以扩展以满足您的需要,原始代码来自 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);
}
}

关于c# - 是否可以将像 C# struct 这样的联合序列化为 XML?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5314230/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com