XML сериализации подкласса, не конструктор без параметров

Обновить

April 2019

Просмотры

27 раз

1

Я пытаюсь сериализация подкласса, не конструктора без параметров другого сериализуемого класса. Независимо от моих попыток я всегда получаю InvalidOperationException из-за отсутствие конструкторы без параметров.

Я пытался бросить мой подкласс базового класса с обоими: simlpe литья (простым литьем я имею в виду скобки с желаемым типом между ними), и с Convert.ChangeType (...). В то время как бывший не работает (я все еще получаю исключение), последний способ в результате с InvalidCastException (сообщение говорит, что объект должен реализовывать интерфейс IConvertible).

Вот базовый класс, который прекрасно сериализации:

 [XmlRoot("NdSRD_Environment")]
    public class Environment
    {
        #pragma warning disable IDE1006 // Naming Styles
        [XmlAttribute]
        public string id { get; set; }
        [XmlElement]
        public double realWidth { get; set; }
        [XmlElement]
        public double realHeight { get; set; }
        [XmlElement]
        public double realDepth { get; set; }
        [XmlElement]
        public int PIXEL_WIDTH { get; set; }
        [XmlElement]
        public int PIXEL_HEIGHT { get; set; }
        [XmlElement]
        public int PIXEL_DEPTH { get; set; }
        [XmlArrayItem(ElementName ="Height")]
        [XmlArray]
        public List<short> heights { get; set; }
        [XmlElement]
        public int worldWidthSegments { get; set; }
        [XmlElement]
        public int worldDepthSegments { get; set; }
        #pragma warning restore IDE1006 // Naming Styles
    }

А вот подкласс, который производит ошибку:

public class FlatEnvironment : NdSRD.WebService.Core.DataModel.Environment
    {
        public readonly static int PIXEL_PER_REAL_METER_RATIO = 100;
        public FlatEnvironment(double realWidth, double realDepth, double maxHeight)
        {
            this.PIXEL_WIDTH = (int)realWidth * PIXEL_PER_REAL_METER_RATIO;
            this.PIXEL_DEPTH = (int)realDepth * PIXEL_PER_REAL_METER_RATIO;
            this.PIXEL_HEIGHT = (int)maxHeight * PIXEL_PER_REAL_METER_RATIO;
            this.worldWidthSegments = 128;
            this.worldDepthSegments = 128;
            this.id = "FLAT_ENVIRONMENT-WxDxmH:" + realWidth + "x" + realDepth + "x" + maxHeight + "-PWxPDxPH:" + PIXEL_WIDTH + "x" + PIXEL_DEPTH + "x" + PIXEL_HEIGHT + " WSxDS:" + this.worldWidthSegments + "x" + this.worldDepthSegments;
            this.realWidth = realWidth;
            this.realDepth = realDepth;
            this.realHeight = maxHeight;
            this.heights = new System.Collections.Generic.List<short>();

            for (int i = 0; i < (this.worldDepthSegments + 1) * (this.worldWidthSegments + 1); i++)
            {
                heights.Add(0);
            }

        }
    }

Обновление 1: Вот мой способ сериализации упомянутых классов:

public void Serialize(string fileName, NdSRD.WebService.Core.DataModel.Environment environment)
        {
            XmlSerializer xs = new XmlSerializer(typeof(NdSRD.WebService.Core.DataModel.Environment));
            System.IO.TextWriter writer = new StreamWriter(fileName);
            xs.Serialize(writer, environment);
            writer.Close();
        }

1 ответы

3

Is there actually a compelling reason for FlatEnvironment to be a subclass? It seems that it's not really serving any purpose other than producing an instance of the base class with certain values, in which case, you're probably better off just having a method that does that. This would solve your serialization problems:

// put this in the Environment class or a static class:
public const int PIXEL_PER_REAL_METER_RATIO = 100;
public static Environment FlatEnvironment(double realWidth, double realDepth, double maxHeight)
{
    const int worldWidthSegments = 128;
    const int worldDepthSegments = 128;
    var heights = new System.Collections.Generic.List<short>();

    for (int i = 0; i < (worldDepthSegments + 1) * (worldWidthSegments + 1); i++)
    {
        heights.Add(0);
    }    
    return new Environment {
        PIXEL_WIDTH = (int)realWidth * PIXEL_PER_REAL_METER_RATIO,
        PIXEL_DEPTH = (int)realDepth * PIXEL_PER_REAL_METER_RATIO,
        PIXEL_HEIGHT = (int)maxHeight * PIXEL_PER_REAL_METER_RATIO,
        worldWidthSegments = worldWidthSegments,
        worldDepthSegments = worldDepthSegments,
        id = "FLAT_ENVIRONMENT-WxDxmH:" + realWidth + "x" + realDepth + "x" + maxHeight + "-PWxPDxPH:" + PIXEL_WIDTH + "x" + PIXEL_DEPTH + "x" + PIXEL_HEIGHT + " WSxDS:" + worldWidthSegments + "x" + worldDepthSegments,
        realWidth = realWidth,
        realDepth = realDepth,
        realHeight = maxHeight, 
    };
}