是否有可能要序列化,如C#结构联合以XML? [英] Would it be possible to serialize a union like C# struct to XML?

查看:216
本文介绍了是否有可能要序列化,如C#结构联合以XML?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

可以说我有这个简单的(工会等)的C#结构

  [StructLayout(LayoutKind.Explicit)
公共结构迈德特
{
    [FieldOffset(0)]
    公众诠释民;
    [FieldOffset(0)]
    公众诠释号码;
    [FieldOffset(4)]
    公共字符串名称;
    [FieldOffset(4)]
    公共字符串网址;
};
 

和保存使用XmlSerializer的和StreamWriter方法​​

 静态无效SaveToXml(obj对象,字符串文件名)
{
    XmlSerializer的作家=新的XmlSerializer(obj.GetType());
    使用(StreamWriter的文件=新的StreamWriter(文件名))
    {
        writer.Serialize(文件,OBJ);
    }
}
 

因此​​,如果我们希望把一些数据并保存:

 迈德特MD =新迈德特();
md.Name =Ilan_01;
md.Num = 1;
SaveToXml(MD,@C:\ TEMP \ data.xml中);
 

XML文件是这样的:

 < XML版本=1.0编码=UTF-8&GT?;
<迈德特的xmlns:XSI =htt​​p://www.w3.org/2001/XMLSchema-instance的xmlns:XSD =htt​​p://www.w3.org/2001/XMLSchema>
  <民> 1< /民>
  &其中;数大于1&其中;数/>
  <名称>&Ilan_01 LT; /名称>
  < URL> Ilan_01< / URL>
< /迈德特>
 

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

 < XML版本=1.0编码=UTF-8&GT?;
<迈德特的xmlns:XSI =htt​​p://www.w3.org/2001/XMLSchema-instance的xmlns:XSD =htt​​p://www.w3.org/2001/XMLSchema>
  <民> 1< /民>
  <名称>&Ilan_01 LT; /名称>
< /迈德特>
 

修改

在另一方面,如果我们想设置这样的数据:

  MD =新迈德特();
md.Url =127.0.0.1;
md.Number = 2;
 

我想看到这个XML作为走出来。

 < XML版本=1.0编码=UTF-8&GT?;
<迈德特的xmlns:XSI =htt​​p://www.w3.org/2001/XMLSchema-instance的xmlns:XSD =htt​​p://www.w3.org/2001/XMLSchema>
  &其中;数大于2&其中;数/>
  < URL> 127.0.0.1< / URL>
< /迈德特>
 

因此​​, XmlIgnore 属性是不是我要找的。

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

最终修改

谢谢,宜兰

解决方案

这不正是你想要的,但可能会扩展,以满足您的需求,原来的code来自某处MSDN,不记得在那里我害怕。我敢肯定,必须有这样做(即对迈德特成员自定义属性)的更优雅的方式,但我不知道它:

 公共结构迈德特
{
    公众诠释民;
    公众诠释号码;
    公共字符串名称;
    公共字符串网址;
};

类XMLIgnore
{
    静态无效SaveToXml(MyData的OBJ)
    {
        XmlSerializer的writer2 = customserialiser(OBJ);
        writer2.Serialize(Console.Out,OBJ);
    }

    静态公共XmlSerializer的customserialiser(迈德特D)
    {
        XMLATTRIBUTES ATTRS =新XMLATTRIBUTES();
        attrs.XmlIgnore = TRUE;
        XmlAttributeOverrides xmlOveride =新XmlAttributeOverrides();

        如果(d.Name.Length!= 0)
            xmlOveride.Add(typeof运算(迈德特),URL,ATTRS);
        其他
            xmlOveride.Add(typeof运算(迈德特),姓名,ATTRS);

        如果(d.Num!= 0)
            xmlOveride.Add(typeof运算(迈德特),号码,ATTRS);
        其他
            xmlOveride.Add(typeof运算(迈德特),民,ATTRS);

        返回新的XmlSerializer(typeof运算(迈德特),xmlOveride);
    }

    公共静态无效去()
    {
        迈德特D =新迈德特();
        d.Num = 1;
        d.Number = 2;
        d.Name =约翰;
        d.Url =快乐;
        SaveToXml(四);

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

        迈德特D2 =新迈德特();
        d2.Num = 0;
        d2.Number = 2;
        d2.Name =;
        d2.Url =快乐;
        SaveToXml(D2);
    }
}
 

Lets say I have this simple (union like) C# struct

[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;
};

And a save method that uses XmlSerializer and StreamWriter

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

So if we'd put some data in and save it:

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

XML File would look like this:

<?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>

Would it be possible to make it look like this (using the same or similar method)??

<?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

On the other hand if we'd set this data:

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

I'd like to see this XML as out come.

<?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 attribute isn't what I'm looking for.

This is just a simple example, the real implementation is with different types (same size) of other structs.

End Edit

Thanks, Ilan

解决方案

This isn't exactly what you want but may be expandable to meet your needs, the original code came from somewhere on msdn, can't remember where I'm afraid. I'm sure there must be a more elegant way of doing this (i.e. have a custom attribute on members of MyData) but I don't know it:

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#结构联合以XML?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆