Проблема с сериализацией объекта в XML в VB.Net - PullRequest
0 голосов
/ 26 августа 2018

Я работаю в системе электронных счетов, которая работает со схемами XSD и XML, у меня есть классы VB из XSD, и я пытаюсь сериализовать XML, но есть сложный тип, который, как мне кажется, может сделать его Работа. Итак, у меня есть класс Invoice с классом детализации внутри и классом CodeType внутри детали. Для счета с несколькими строками, скажем, 4, у меня должно быть 4 разных кода в поле CodoType, однако каждый новый код перезаписывает последний, поэтому в конце у меня есть 4 поля кода с точно такими же данными, код за 4-й пункт. Если я пытаюсь изменить это все 4 изменения на то же самое. Вот схема классов: Классы

Вот мой код:

  enter code here 
Dim Producto As New FacturaElectronicaLineaDetalle
Dim items(20) As FacturaElectronicaLineaDetalle
Dim Codigo0 As New CodigoType
Dim ProductoCodigos0(0) As CodigoType

For Each row As DataGridViewRow In grdDetalle.Rows
            If row.Cells(0).Value = Nothing Then Exit For

            Producto.NumeroLinea = row.Index + 1
            Producto.Cantidad = row.Cells(4).Value
            Producto.UnidadMedida = 1
            Producto.Detalle = row.Cells(2).Value
            Producto.PrecioUnitario = FormatNumber(row.Cells(3).Value, 5)
            Producto.MontoTotal = Producto.PrecioUnitario * Producto.Cantidad
            Producto.MontoDescuento = 0.00000
            Producto.SubTotal = Producto.MontoTotal - Producto.MontoDescuento

            Codigo0 = New CodigoType
            Codigo0.Tipo = CodigoTypeTipo.Item01
            Codigo0.Codigo = row.Cells(1).Value
            ProductoCodigos0(0) = New CodigoType
            ProductoCodigos0(0) = Codigo0
            Producto.Codigo = ProductoCodigos0
            items(row.Index) = Producto
            Producto = New FacturaElectronicaLineaDetalle

        Next row

        Factura.DetalleServicio = items

Заранее благодарю за помощь, у меня нет большого опыта работы с XML, поэтому я прошу прощения.

С наилучшими пожеланиями.

1 Ответ

0 голосов
/ 26 августа 2018

Проблема в том, что, даже если вы установите новый элемент в массиве ProductoCodigos0, сам массив останется прежним. То есть все ваши экземпляры классов в настоящее время ссылаются на один и тот же массив.

Как правило, не очень хорошая практика объявлять одноразовые переменные вне цикла. Если бы вы вместо этого объявили все их (кроме items) внутри цикла, у вас никогда бы не было этой проблемы.

Наконец, вместо объявления items в качестве массива фиксированного размера, используйте динамический размер List(Of T), чтобы лучше избегать NullReferenceException с и IndexOutOfRangeException с при у вас есть более 21 предметов.

Dim items As New List(Of FacturaElectronicaLineaDetalle)

For Each row As DataGridViewRow In grdDetalle.Rows
    If row.Cells(0).Value = Nothing Then Exit For

    Dim Producto As New FacturaElectronicaLineaDetalle
    Producto.NumeroLinea = row.Index + 1
    Producto.Cantidad = row.Cells(4).Value
    Producto.UnidadMedida = 1
    Producto.Detalle = row.Cells(2).Value
    Producto.PrecioUnitario = FormatNumber(row.Cells(3).Value, 5)
    Producto.MontoTotal = Producto.PrecioUnitario * Producto.Cantidad
    Producto.MontoDescuento = 0.00000
    Producto.SubTotal = Producto.MontoTotal - Producto.MontoDescuento

    Dim Codigo As New CodigoType
    Codigo.Tipo = CodigoTypeTipo.Item01
    Codigo.Codigo = row.Cells(1).Value
    Producto.Codigo = New CodigoType() {Codigo} 'Here we create the CodigoType array instead.

    items.Add(Producto)
Next

Factura.DetalleServicio = items.ToArray()
...