指定的强制转换是无效的C#Console App

时间:2017-06-18 15:07:44

标签: c# .net serialization

这是我得到的错误..

http://i.imgur.com/VWTa4Mf.png

这是我的代码..

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

namespace LoginServer
{
[Serializable]
class MessageData
{
    public int type = 0;
    public string stringData = "";

    public static MessageData FromByteArray(byte[] input)
    {
        MemoryStream stream = new MemoryStream(input);
        BinaryFormatter formatter = new BinaryFormatter();
        MessageData data = new MessageData();
        data.type = (int)formatter.Deserialize(stream);
        data.stringData = (string)formatter.Deserialize(stream);

        if (data.stringData == "")
        {
            data.type = 999;
            data.stringData = "No command included";
        }

        return data;
    }

    public static byte[] ToByteArray(MessageData msg)
    {
        MemoryStream stream = new MemoryStream();
        BinaryFormatter formatter = new BinaryFormatter();

        formatter.Serialize(stream, msg.type);
        formatter.Serialize(stream, msg.stringData);

        return stream.ToArray();
      }
   }
}

真的不确定为什么我不能把这个演员用作int ..

我花了很多时间来解决这个问题,即使使用const int,但这并不能解决问题。

将type设置为int,data为MessageData,因此int应该可以正常工作....

请帮忙。

1 个答案:

答案 0 :(得分:2)

你应该替换你所做的演员:

data.type = (int)formatter.Deserialize(stream);
data.stringData = (string)formatter.Deserialize(stream);

使用以下内容:

data = (MessageData)formatter.Deserialize(stream);

因为您应该反序列化它的对象应该是MessageData类型。此外,您还必须更改以下内容:

formatter.Serialize(stream, msg.type);
formatter.Serialize(stream, msg.stringData);

用这个:

formatter.Serialize(stream, msg);

通常我们序列化一个对象,然后我们反序列化结果以获得原始对象。我们不会单独序列化objet的每个属性,然后分别反序列化它们。

对于基本的序列化方法,请求查看here