【问题标题】:Why my second foreach dont output anything?为什么我的第二个 foreach 不输出任何东西?
【发布时间】:2021-12-11 07:01:03
【问题描述】:

我不知道为什么 Main 中的第二个 foreach 不能按预期工作。我想序列化一个列表,然后将其转换为数组,对其进行排序,再次转换为列表,然后对其进行序列化,但我的反序列化有点不起作用,我不知道为什么。

我的类库:

[Serializable]
public class Kolekcja<T> : ISerializable, IEnumerable<T> where T : IComparable<T>
{
    private List<T> lista = new List<T>();
    [NonSerialized]
    private int liczba1, liczba2;
    [NonSerialized]
    private int suma, roznica, iloczyn;

    public void Add(T item)
    {
        lista.Add(item);
    }

    public void Remove(T item)
    {
        lista.Remove(item);
    }

    public void RemoveAt(int item)
    {
        lista.RemoveAt(item);
    }
    public IEnumerator<T> GetEnumerator()
    {
        return lista.GetEnumerator();

    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return lista.GetEnumerator();
    }

    void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
    {
        List<T> lista2;
        T[] tablica;
        //wariant1
        tablica = lista.ToArray();
        Array.Sort<T>(tablica);
        info.AddValue("tablica", tablica, typeof(T[]));
    }

    public Kolekcja(SerializationInfo sinfo, StreamingContext ctx)
    {
        T[] tablica = (T[])sinfo.GetValue("tablica", typeof(T[]));
        lista = new List<T>(lista);
    }

    public Kolekcja()
    {

    }

    public Kolekcja(List<T> lista)
    {

    }

    public int Count => lista.Count;
    //public int Count { get {return lista.Count;}}
    public T Max => lista.Max();
    public T Min => lista.Min();

    public T this[int i]
    {
        get { return lista[i]; }
        set { lista[i] = value; }
    }

    public static bool operator <(Kolekcja<T> a, Kolekcja<T> b)
    {
        return a.Max.CompareTo(b.Min) < 0;
    }

    public static bool operator >(Kolekcja<T> a, Kolekcja<T> b)
    {
        return a.Min.CompareTo(b.Max) > 0;
    }
} 

我的主要:

class Program
{
    static void Main(string[] args)
    {
        Kolekcja <int> numbers = new Kolekcja<int>();
        numbers.Add(1);
        numbers.Add(3);
        numbers.Add(2);
        
        foreach(var el in numbers)
        {
            Console.WriteLine(el);
        }
        Stream fs = new FileStream("data.dat", FileMode.Create);
        BinaryFormatter bf = new BinaryFormatter();

        bf.Serialize(fs, numbers);

        fs.Close();

        fs = new FileStream("data.dat", FileMode.Open);
        bf = new BinaryFormatter();

        numbers = (Kolekcja<int>) bf.Deserialize(fs);

        foreach (var el in numbers)
        {
            Console.WriteLine(el);
        }

        fs.Close();
    }
}  

我真的不知道我是否遗漏了什么或者我的反序列化错误,我尝试用谷歌搜索但没有任何帮助,而且我似乎还不了解序列化。

【问题讨论】:

  • 旁注:在娱乐的同时,请确保将 BinaryFormatter 的使用仅用于教育目的 - docs.microsoft.com/en-us/dotnet/standard/serialization/…
  • 您能否详细说明一下:我的反序列化有点不起作用?它返回null吗?它会抛出异常吗?其他?
  • @PeterCsala 它实际上没有显示任何内容:D
  • @Mezus 请查看我的帖子。我发现了你的错误。

标签: c# serialization deserialization


【解决方案1】:

您的代码有以下错误:

public Kolekcja(SerializationInfo sinfo, StreamingContext ctx)
{
    T[] tablica = (T[])sinfo.GetValue("tablica", typeof(T[]));
    lista = new List<T>(lista); //bug
}

这里是修复:

public Kolekcja(SerializationInfo sinfo, StreamingContext ctx)
{
    T[] tablica = (T[])sinfo.GetValue("tablica", typeof(T[]));
    lista = new List<T>(tablica);
}

【讨论】:

  • 非常感谢!!我很高兴这是一个小错误(也很抱歉波兰语,它必须令人困惑)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-10
  • 2020-09-07
  • 2012-04-27
  • 1970-01-01
  • 1970-01-01
  • 2011-04-27
相关资源
最近更新 更多