首页 新闻 会员 周边 捐助

System.Xml.Serialization,有关序列化的问题

0
悬赏园豆:200 [已解决问题] 解决于 2011-06-24 21:47

大家都知道,序列化的时候

public List<MyClass> A{get;set;};

class MyClass{

public string B{get;set;}

}

会序列化为

<A>

  <MyClass>

      <B>string1</B>

  </MyClass>

  <MyClass>

      <B>string2</B>

  </MyClass>

  <MyClass>

  ...

  </MyClass>

</A>

可是我现在希望不要有<A>和</A>这个XmlArrayAttribute,即序列化之后是

<MyClass>

    <B>string1</B>

</MyClass>

<MyClass>

    <B>string2</B>

</MyClass>

<MyClass>

    ...

</MyClass>

应该如何做?望解答,感谢!

问题补充:

[XmlRoot("root")]

Class MyClass1

{

public List<MyClass>  A{get;set;};

}

class MyClass

{

public string B{get;set;}

}

序列化以后是

<root>

  <A>

    <MyClass>

      <B>string1</B>

    </MyClass>

    <MyClass>

      <B>string2</B>

    </MyClass>

    <MyClass>

      ...

    </MyClass>

  </A>

</root>

现在希望序列化成

<root>

  <MyClass>

    <B>string1</B>

  </MyClass>

  <MyClass>

    <B>string2</B>

  </MyClass>

  <MyClass>

    ...

  </MyClass>

</root>

我是小b的主页 我是小b | 初学一级 | 园豆:2
提问于:2011-06-21 17:13
< >
分享
最佳答案
0

1,从 List<MyClass> 继承一个新类;

2,不使用List<>,直接使用MyClass[]数组;

3,使用XmlElement标记;

 

[XmlRoot("root")]
public class MyClass1 {
[XmlElement(
"MyClass")]
public List<MyClass> A { get; set; }
}

public class MyClass {
public string B { get; set; }
}


class Program {
static void Main(string[] args) {
MyClass1 root
= new MyClass1();
root.A
= new List<MyClass>(new MyClass[] { new MyClass { B = "string1" }, new MyClass { B = "string2" } });

using(MemoryStream ms = new MemoryStream()) {
XmlSerializer serializer
= new XmlSerializer(typeof(MyClass1));
serializer.Serialize(ms, root);

ms.Seek(
0, SeekOrigin.Begin);
Console.WriteLine(Encoding.Default.GetString(ms.ToArray()));
}

Console.Read();
}
}
收获园豆:200
Launcher | 高人七级 |园豆:45050 | 2011-06-22 10:17
没想到List也能标记成XmlElement
我是小b | 园豆:2 (初学一级) | 2011-06-23 10:32
第1种方法没有测试
第2种无效,数组表达与List相同
第3种成功!
我是小b | 园豆:2 (初学一级) | 2011-06-24 21:50
其他回答(3)
0

如果你是想去掉根那是不可能的,因为xml必须满足树形结构。希望你能进一步说明问题。

today4king | 园豆:3499 (老鸟四级) | 2011-06-21 17:34
[XmlRoot("root")]
Class MyClass1{
public List A{get;set;};
}
class MyClass{
public string B{get;set;}
}

序列化以后是



string1


string2


...




现在希望序列化成


string1


string2


...

支持(0) 反对(0) 我是小b | 园豆:2 (初学一级) | 2011-06-21 17:59
@
我是小b:




string1





string2





...




如果你只是想序列化成这种样子,何不直接xmlserialize(root)//root=new List()
希望能解决你的问题
支持(0) 反对(0) today4king | 园豆:3499 (老鸟四级) | 2011-06-21 18:20
显然不是只想序列化成这种样子
支持(0) 反对(0) 我是小b | 园豆:2 (初学一级) | 2011-06-21 19:29
0

想用内置的实现,就得守默认的规则,否则自己直接拼字符串,那才是万能的方法。

 

或者将序列后的结果,把<A>替换成<Root>,把</A>替换成</Root>,这个很容易。

菩提树下的杨过 | 园豆:556 (小虾三级) | 2011-06-21 21:54
0

虽然没看你具体的要求,希望下面的方法能帮助你:
自定义xmlSerialization规则
 xmlRootAttribute、xmlAttributeAttribute、xmlElementAttribute 

shenopkss | 园豆:310 (菜鸟二级) | 2011-06-24 17:35
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册