序列化:如何在C#中反序列化

时间:2014-06-29 12:04:33

标签: c# serialization deserialization

如何根据我在此方法中的操作反序列化字符串?基本上,我在这里使用序列化将字符串传递到网络并反序列化字符串以传达消息。但是一旦我设法收到消息,我就不知道我所做的事情是否正确。这是代码:

string ConvertToString(FrogGame np, Frog1 pm, Frog2 pm2) //Serialization. the three parameters are the classes. 
        {
            XmlSerializer sendSerializer = new XmlSerializer(typeof(FrogGame),new Type[]{typeof(Frog1),typeof(Frog2)});
            StreamWriter myWriter = new StreamWriter(@"pad1.xml");
            sendSerializer.Serialize(myWriter, np);
            sendSerializer.Serialize(myWriter, pm);
            sendSerializer.Serialize(myWriter, pm2);
            return myWriter.ToString();
        } //Overall, I serialize it into string

一旦我通过网络传递字符串,我想反序列化它,以便将消息传递给类。我如何继续这里?我怎么编辑?代码:

void StringReceived(string str) //so str is myWriter.ToString()
        {
            XmlSerializer revSerializer = new XmlSerializer(typeof(FrogGame), new Type[] { typeof(Frog1), typeof(Frog2) });
            FileStream myFileStream = new FileStream(@"pad1.xml", FileMode.Open);
            FrogGame b = (FrogGame)revSerializer.Deserialize(myFileStream);

            if (b is Frog1) 
            {
                if (Network.IsServer())
                {
                    pm = (Frog1)b;
                    pm.Position.Y = b.pm.Position.Y;
                    pm.Position.X = b.pm.Position.X;
                }
                else
                {
                    System.Diagnostics.Debug.WriteLine("BAD Message: " + msg);
                }
            }

            else if (b is Frog2)
            {
                if (Network.IsClient())
                {
                    pm2 = (PaddleMessage2)b;
                    pm2.Position.Y = b.pm2.Position.Y;
                    pm2.Position.X = b.pm2.Position.X;
                }
                else
                {
                    System.Diagnostics.Debug.WriteLine("BAD Message: " + msg);
                }
            }

        }

1 个答案:

答案 0 :(得分:3)

我可能会误解你的问题,但我为什么不把你想要保存的所有内容都保存在课堂上并按照这样做(另外,如果你使用课程,你的数据“运输”和“管理”将会更容易):

<强> SERIALIZATION

XmlSerializer serializer = new XmlSerializer(typeof(FrogGameData));
TextWriter textWriter = new StreamWriter("FrogGameSaveFile.xml");
serializer.Serialize(textWriter, _frogGameData);
textWriter.Close();

<强>反序列化

XmlSerializer deserializer = new XmlSerializer(typeof(FrogGameData));
TextReader textReader = new StreamReader("FrogGameSaveFile.xml");
_frogGameData = (FrogGameData)deserializer.Deserialize(textReader);
textReader.Close();

注意:需要保存的字段应具有属性,因为XML中的标记将模仿属性名称。

附加说明: FrogGameData与自动序列化的普通类没有区别。 XML将模拟XML文件中类的属性顺序。

但是,如果您需要重新排列XML标记位置,可以在属性顶部执行[XmlElement(Order = 1)][XmlElement(Order = 2)]等操作,以自定义XML文件中的顺序。


更新

如果您需要它,这是您的FrogGameData类的示例:

public class FrogGameData
{
    private Frog _frog1;
    private Frog _frog2;

    public Frog Frog1
    {
        get { return _frog1; }
        set { _frog1 = value; }
    }

    public Frog Frog2
    {
        get { return _frog2; }
        set { _frog2 = value; }
    }
}

XML非常像这样:

<?xml version="1.0" encoding="utf-8"?>
<FrogGameData>
    <Frog1>Something-depends-on-your-data</Frog1>
    <Frog2>Something-depends-on-your-data</Frog2>
</FrogGameData>

但是,如果您的课程是(请注意XmlElement部分):

public class FrogGameData
{
    private Frog _frog1;
    private Frog _frog2;

    [XmlElement(Order = 2)]
    public Frog Frog1
    {
        get { return _frog1; }
        set { _frog1 = value; }
    }

    [XmlElement(Order = 1)]
    public Frog Frog2
    {
        get { return _frog2; }
        set { _frog2 = value; }
    }
}

然后,您的XML将是:

<?xml version="1.0" encoding="utf-8"?>
<FrogGameData>
    <Frog2>Something-depends-on-your-data</Frog2>
    <Frog1>Something-depends-on-your-data</Frog1>
</FrogGameData>