json 当目标类未正确反序列化时,XML反序列化程序

fnatzsnv  于 2023-05-08  发布在  其他
关注(0)|答案(1)|浏览(197)

我创建了一个类Point,它使用UnitsNet nuget包中的Length类型进行单位转换:

public class Point
{
    public Point() { }

    [JsonConstructor]
    public Point(Length x, Length y, Length z)
    {
        X = x;
        Y = y;
        Z = z;
    }

    public Length X { get; set; }
    public Length Y { get; set; }
    public Length Z { get; set; }
}

这个类然后被我创建的其他类(如Line)作为公共属性使用:

public class Line
{
    public string Name { get; set; }
    public Point StartPoint { get; set; } = new(new Length(), new Length(), new Length());
    public Point EndPoint { get; set; } = new(new Length(), new Length(), new Length());
}

当我使用类似下面的XML反序列化Line对象时,我得到的length值为零:

<?xml version="1.0"?>
<File>
    <Name>Sketch2</Name>
    <Line>
      <Name>Line4</Name>
      <Volume>28.30188679245283</Volume>
      <StartPoint>
        <X>0.71161836352506369</X>
        <Y>0.44158426707323123</Y>
        <Z>0</Z>
      </StartPoint>
      <EndPoint>
        <X>0.79110301979189424</X>
        <Y>0.596011599248788</Y>
        <Z>0</Z>
      </EndPoint>
    </Line>
</File>

现在我想我会遇到这个XML的问题,因为它没有指定双精度值应该是什么单位(米、毫米、厘米等)。
感觉就像我需要为PointLength手动创建一个解串器。但这可能根本不是正确的道路。
我尝试将XML转换为JSON,因为JSON反序列化似乎有更好的控制。JSON反序列化,但我仍然没有得到X,Y和Z的值。我已经烧了大约一天在这一点上,我认为我需要一些方向,以正确的方式做到这一点。

w8biq8rn

w8biq8rn1#

这是一个超级黑客,不优雅的解决方案。我通过(coughcough)互联网上的各种方法得出了这个结论。

[DataContract]
public class Point
{
    private double _x;
    public Point() { }

    [XmlElement(ElementName = "X")]
    public double InitializerX
    {
        get => _x;
        set
        {
            _x = value;
            X = new Length(_x, LengthUnit.Meter);
        }
    }

    [XmlIgnore]
    public Length X { get; set; }
    public Length Y { get; set; }
    public Length Z { get; set; }

}

有很多理由讨厌它。首先,它创建的这个InitializerX属性是public Length X的一个有点令人困惑的版本。因为XML不能处理私有字段、属性等。我必须公开。
希望有人有更好的解决方案,然后呢???

相关问题