Как исправить эту ошибку в десериализации? - PullRequest
0 голосов
/ 13 октября 2018

Произошло необработанное исключение типа 'System.InvalidCastException' в sCreator.exe Дополнительная информация: Невозможно привести объект типа 'System.String' к типу 'sCreator.Shape'.

Вот код:

    public void Deseriaize(StreamReader file)
    {
        XmlSerializer ser = new XmlSerializer(typeof(string));
        Shape s = (Shape)ser.Deserialize(file);
        file.Close();
        MessageBox.Show(s.title);
    }

    private void btn_OpenProject_Click(object sender, EventArgs e)
    {
        StreamReader file = new StreamReader(@"C:\Users\pb8n0053\Documents\SerializationOverview.seal");
        Deseriaize(file);
    }

Класс формы

 [Serializable]
public class Shape
{
    //Properties
    public Draw draw;
    public String title;
    public float width { get; set; }
    public float height { get; set; }
    public float x { get; set; }
    public float y { get; set; }
    public static PointF center = new PointF(250f, 250f);
    public int strokeThickness { get; set; }
    public Color color { get; set; }
    public float userDefinedWidth { get; set; }
    public float userDefinedHeight { get; set; }
    public int userDefinedStroke { get; set; }
    public SizeF size;
    public PointF location;
    public float radius;
    public ShapeType type;
    public Status status;
    public enum ShapeType
    {
        rectangle, square, circle, ellipse, triangle, image
    }
    public enum Status
    {
        editing, start
    }
}

1 Ответ

0 голосов
/ 13 октября 2018

Ваш XmlSerializer создается с typeof(string) в качестве аргумента для конструктора.Это означает, что этот сериализатор предназначен для преобразования XML в System.String.Если вы хотите, чтобы он преобразовал ваш XML в тип Shape и обратно, то инициализируйте его, используя вместо этого:

public void Deseriaize(StreamReader file)
{
    XmlSerializer ser = new XmlSerializer(typeof(Shape));
    Shape s = (Shape)ser.Deserialize(file);
    file.Close();
    MessageBox.Show(s.title);
}

Обратите внимание, что цикл сериализации / десериализации, вероятно, потерпит неудачу или будет работать неправильно, если вы попытаетесьдесериализовать XML, который не был создан с XmlSerializer или если ваш класс Shape неправильно реализует ISerializable.

...