C#中的XMLSerializer不包括类

时间:2016-01-24 19:40:47

标签: c# xml

您好,我想在C#中使用XMLSerializer序列化这两个类:

Paquete.cs

using UnityEngine;

using System.Collections;
using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;
using System.Xml.Serialization;
using System.IO;

[XmlRoot("Paquete")]
public class Paquete {

    //El identificador del paquete. Aqui ira la accion que se esta enviando en el juego 
    public enum Identificador
    {
        moverIzquierda,
        moverDerecha,
        moverArriba,
        moverAbajo,
        avanzar,
        disparar,
        Null
    }
    public Identificador identificadorPaquete;
    public int jugador; 

    //[XmlArray("B"),XmlArrayItem("Bullet")]
    public List<Bullet> bullets = new List<Bullet> ();






    // Default Constructor
    public Paquete()
    {
        this.identificadorPaquete = Identificador.Null;
        this.jugador = -1;
        this.bullets = new List<Bullet> ();
    }


    // Convierte un paquete a un data stream para enviar y recibir datos
    //Tambien lo debemos modificar para que se acople a las acciones del juego
    public string GetDataStream()
    {
        string result = "";
        XmlSerializer serializer = new XmlSerializer (typeof(Paquete));
        StringWriter writer = new StringWriter ();
        serializer.Serialize (writer, this);
        result = writer.ToString ();
        Debug.Log ("El xml: "+result);
        return result;


    }

}

Bullet.cs

using System.Collections;
using System.Xml;
using System.Xml.Serialization;
using System.IO;

public class Bullet  {

    //[XmlAttribute("id")]
    int id;
    //[XmlAttribute("px")]
    float px;
    //[XmlAttribute("py")]
    float py;
    //[XmlAttribute("pz")]
    float pz;
    //[XmlAttribute("rx")]
    float rx;
    //[XmlAttribute("ry")]
    float ry;
    //[XmlAttribute("rz")]
    float rz;

    public Bullet(){
        this.px = 0;
        this.py = 0;
        this.pz = 0;
        this.rx = 0;
        this.ry = 0;
        this.rz = 0;    
    }
    public Bullet(int id,float px,float py, float pz,float rx,float ry,float rz){
        this.id = id;
        this.px = px;
        this.py = py;
        this.pz = pz;
        this.rx = rx;
        this.ry = ry;
        this.rz = rz;
    }


}

这是我用来测试我的代码的原因:

Paquete p = new Paquete ();
p.jugador = 6;
string s;
p.bullets.Add (new Bullet(0,1,1,1,1,1,1));
p.bullets.Add (new Bullet (1,2, 2, 2, 2, 2, 2));

s = p.GetDataStream ();

我得到的xml是这样的:

<?xml version="1.0" encoding="utf-16"?>
<Paquete xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <identificadorPaquete>Null</identificadorPaquete>
  <jugador>6</jugador>
  <bullets>
    <Bullet />
    <Bullet />
  </bullets>
</Paquete>

如您所见,Bullet数组不包含我在班级中定义的任何属性。

任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:2)

XmlSerializer并未考虑私人字段,因为他们没有在输出中显示原因。如果您将这些变量公开并使用XmlAttribute标记它们,您可以在结果XML中看到它们:

如果你改变它

[XmlAttribute("id")]
public int id;

你得到:

<?xml version="1.0" encoding="utf-16"?>
<Paquete xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <identificadorPaquete>Null</identificadorPaquete>
  <jugador>6</jugador>
  <bullets>
    <Bullet id="0" />
    <Bullet id="1" />
  </bullets>
</Paquete>