XML序列化器在photon RPC命令中导致空引用

本文关键字:引用 命令 RPC 序列化 photon XML | 更新日期: 2023-09-27 18:07:52

我得到这个代码xml序列化器并试图让它工作,但创建的对象包含nullreference

public  byte[] SerializeObject <T>(T serializableObject)
{
    T obj = serializableObject;
    using (MemoryStream stream = new MemoryStream())
    {
        System.Xml.Serialization.XmlSerializer x = new System.Xml.Serialization.XmlSerializer(typeof(T));
        x.Serialize (stream,obj);
        return stream.ToArray ();
    }
}
public  T DeserializeObject <T>(byte[] serilizedBytes)
{
    System.Xml.Serialization.XmlSerializer x = new System.Xml.Serialization.XmlSerializer (typeof(T));
    using (MemoryStream stream = new MemoryStream(serilizedBytes)) 
    {
        return (T) x.Deserialize (stream);
    } 
}

我使用这个函数初始化类变量,我找不到null在哪里

public void updateinfo(int []card, int lmin, int lbom, int pass, int mxint,int cardinturn, int lastsim, int fplayer, float ang, int playid,string namepl,int numberofcard){
    o1=new playerupdates();
    o1.cardstoad = new int[card.Length];
    for(int i=0;i<card.Length;i++){
        o1.cardstoad[i]=card[i];
    }
o1.lastmin=lmin;
o1.lastbomb=lbom;
o1.passnumber=pass;
o1.maxvalueinturn=mxint;
o1.cardsinturn=cardinturn;
o1.lastsimiliarvalue=lastsim;
o1.firstplayer=fplayer;
o1.angle=ang;
o1.playerid=playid; 
o1.playername=namepl;
o1.cardsin=numberofcard;
}

我一直在寻找解决办法,但一无所获。初始化类变量的函数是否正确?编辑类代码

public int []cardstoad { get; set; }
public int lastmin { get; set; }
public int lastbomb { get; set; }
public int passnumber{ get; set; } 
public int maxvalueinturn { get; set; }
public int cardsinturn { get; set; }
public int lastsimiliarvalue { get; set; }
public int firstplayer { get; set; }
public float angle{ get; set; }
public int playerid { get; set; }
public string playername { get; set; }
public int cardsin{ get; set; }

XML序列化器在photon RPC命令中导致空引用

你的问题是我什么都没做。Updateinfo正在设置值,但是从Updateinfo返回后o1丢失。参见下面的代码更正

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Xml;
using System.Xml.Serialization;
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] card = {1,2,3,4,5};
            int lmin = 4;
            int lbom = 5;
            int pass = 6;
            int mxint = 7;
            int cardinturn = 8;
            int lastsim = 9;
            int fplayer = 10;
            float ang = 30.0F;
            int playid = 100;
            string namepl = "abc";
            int numberofcard = 26;
            playerupdates pU = new playerupdates();
            pU.updateinfo(card, lmin, lbom, pass, mxint, cardinturn, lastsim, fplayer, ang, playid, namepl, numberofcard);
            byte[] data = pU.SerializeObject<playerupdates>(pU);
            string test = Encoding.UTF8.GetString(data);    //test to see if serialize is working correctly
            playerupdates newPU = pU.DeserializeObject<playerupdates>(data);
        }
    }
    [XmlRoot("playerupdates")]
    public class playerupdates
    {
        [XmlElement("cardstoad")]
        public int[] cardstoad { get; set; }
        [XmlElement("lastmin")]
        public int lastmin { get; set; }
        [XmlElement("lastbomb")]
        public int lastbomb { get; set; }
        [XmlElement("passnumber")]
        public int passnumber { get; set; }
        [XmlElement("maxvalueinturn")]
        public int maxvalueinturn { get; set; }
        [XmlElement("cardsinturn")]
        public int cardsinturn { get; set; }
        [XmlElement("lastsimiliarvalue")]
        public int lastsimiliarvalue { get; set; }
        [XmlElement("firstplayer")]
        public int firstplayer { get; set; }
        [XmlElement("angle")]
        public float angle { get; set; }
        [XmlElement("playerid")]
        public int playerid { get; set; }
        [XmlElement("playername")]
        public string playername { get; set; }
        [XmlElement("cardsin")]
        public int cardsin { get; set; }
        public void  updateinfo(int[] card, int lmin, int lbom, int pass, int mxint, int cardinturn, int lastsim, int fplayer, float ang, int playid, string namepl, int numberofcard)
        {
            //o1 not needed
            //playerupdates o1 = new playerupdates();
            cardstoad = new int[card.Length];
            for (int i = 0; i < card.Length; i++)
            {
                cardstoad[i] = card[i];
            }
            lastmin = lmin;
            lastbomb = lbom;
            passnumber = pass;
            maxvalueinturn = mxint;
            cardsinturn = cardinturn;
            lastsimiliarvalue = lastsim;
            firstplayer = fplayer;
            angle = ang;
            playerid = playid;
            playername = namepl;
            cardsin = numberofcard;
        }
        public byte[] SerializeObject<T>(T serializableObject)
        {
            T obj = serializableObject;
            using (MemoryStream stream = new MemoryStream())
            {
                System.Xml.Serialization.XmlSerializer x = new System.Xml.Serialization.XmlSerializer(typeof(T));
                x.Serialize(stream, obj);
                return stream.ToArray();
            }
        }
        public T DeserializeObject<T>(byte[] serilizedBytes)
        {
            System.Xml.Serialization.XmlSerializer x = new System.Xml.Serialization.XmlSerializer(typeof(T));
            using (MemoryStream stream = new MemoryStream(serilizedBytes))
            {
                return (T)x.Deserialize(stream);
            }
        }
    }
}
​