Увеличение размера массива десериализованного XML-файла - PullRequest
1 голос
/ 11 февраля 2010

У меня есть XML-файл, который я десериализую в объект класса. Этот класс содержит ряд других классов, некоторые из которых являются массивами.

Я бы хотел увеличить размер массива некоторых объектов.

Как я могу это сделать?

В следующем примере объект MyData имеет размер массива 5, но, скажем, MyArrayClass имеет размер массива только 1.

        for (int i = 0; i < 5; i++)
        {
            MyMainClass.MyAnotherClass.MyArrayClass[i] = MyData[i];
        }

Этот код, таким образом, не выполняется из-за исходного размера массива MyArrayClass. Как мне увеличить его размер?

спасибо.

Ответы [ 3 ]

1 голос
/ 11 февраля 2010

C # имеет память менеджера - просто добавьте в нее новый массив такого размера, какой пожелаете. Сборщик мусора очистит старый для вас, если вам не нужны данные. Если вы это сделаете, то создайте новый файл того размера, который вам нужен, и скопируйте все старые данные, используя тот метод, который вы предпочитаете, а затем просто присвойте старому новый, и пусть сборщик мусора очистит старый один.

0 голосов
/ 11 февраля 2010

A List<T> должно работать просто отлично; наличие массивов в объектном API просто причинит боль:

using System;
using System.Collections.Generic;
using System.IO;
using System.Xml.Serialization;
public class Foo
{
    private List<Bar> bars = new List<Bar>();
    public List<Bar> Bars { get { return bars; } }
}

public class Bar {
    public string Name { get; set; }
}

static class Program
{
    static void Main()
    {
        Foo orig = new Foo { Bars = { new Bar { Name = "abc"},
            new Bar { Name = "def"}}}, clone;
        using(MemoryStream ms = new MemoryStream()) {
            XmlSerializer ser = new XmlSerializer(orig.GetType());
            ser.Serialize(ms, orig);
            ms.Position = 0;
            clone = (Foo)ser.Deserialize(ms);
        }
        clone.Bars.Add(new Bar { Name = "ghi" });
        foreach (Bar bar in clone.Bars)
        {
            Console.WriteLine(bar.Name);
        }
    }
}

Кроме того, вы можете написать метод расширения для добавления, но это не эффективный способ манипулирования списками данных:

using System;
public class Foo
{
    public Bar[] Bars { get; set; }
}

public class Bar {
    public string Name { get; set; }
}

static class Program
{
    static T[] Append<T>(this T[] arr, T value)
    {
        Array.Resize<T>(ref arr, arr == null ? 1 : (arr.Length + 1));
        arr[arr.Length - 1] = value;
        return arr;
    }
    static void Main()
    {
        Foo obj = new Foo { Bars = new[] { new Bar { Name = "abc" }, new Bar { Name = "def" } } };
        obj.Bars = obj.Bars.Append(new Bar { Name = "ghi" });
        foreach (Bar bar in obj.Bars)
        {
            Console.WriteLine(bar.Name);
        }
    }
}
0 голосов
/ 11 февраля 2010

Я не очень разбираюсь в десериализации C #, но должен ли это быть массив? Не могли бы вы использовать какой-то тип списка вместо? Таким образом, вам не нужно иметь дело с калибровкой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...