gpt4 book ai didi

c# - 使用 protobuf-net 序列化不可变集合

转载 作者:太空宇宙 更新时间:2023-11-03 11:04:44 26 4
gpt4 key购买 nike

我正在尝试使用 protobuf-net 序列化一个类,其中包含一个不可变集合作为成员。

集合类型,ImmutableList<T> , 工具 ICollection<T>但返回 true对于 IsReadOnly属性(property)。因此,任何对其进行修改的尝试都会引发异常。

Protobuf-net 似乎依赖于能够调用 Add(T)在创建一个集合以填充它之后。这显然不适用于不可变集合,这很遗憾,因为 protobuf-net 可以完美地与我所有其他数据类型一起工作,这些数据类型也是不可变的。

所以我的问题是,我必须有哪些选项才能序列化此类集合?


ImmutableList<T> 的代码如下所示:

public sealed class ImmutableList<T> : IList<T>, IList
{
private readonly T[] m_Items;

public ImmutableList(IEnumerable<T> source)
{
m_Items = source.ToArray();
}

public T[] ToArray()
{
T[] newArray = new T[m_Items.Length];
m_Items.CopyTo(newArray, 0);
return newArray;
}

private static void ThrowNotSupported()
{
throw new NotSupportedException("The attempted operation was not supported as the collection is read-only.");
}

#region IList<T> Members

int IList.Add(object value)
{
ThrowNotSupported();
return -1;
}

void IList.Clear()
{
ThrowNotSupported();
}

void IList<T>.Insert(int index, T item)
{
ThrowNotSupported();
}

void IList.Insert(int index, object value)
{
ThrowNotSupported();
}

void IList.Remove(object value)
{
ThrowNotSupported();
}

void IList.RemoveAt(int index)
{
ThrowNotSupported();
}

void IList<T>.RemoveAt(int index)
{
ThrowNotSupported();
}

T IList<T>.this[int index]
{
get
{
return m_Items[index];
}
set
{
ThrowNotSupported();
}
}

object IList.this[int index]
{
get
{
return m_Items[index];
}
set
{
ThrowNotSupported();
}
}

public T this[int index]
{
get
{
return m_Items[index];
}
}

bool IList.Contains(object value)
{
return Array.IndexOf(m_Items, value) != -1;
}

int IList.IndexOf(object value)
{
return Array.IndexOf(m_Items, value);
}

public int IndexOf(T item)
{
return Array.IndexOf(m_Items, item);
}

bool IList.IsFixedSize
{
get
{
return true;
}
}

#endregion

#region ICollection<T> Members

void ICollection<T>.Add(T item)
{
ThrowNotSupported();
}

void ICollection<T>.Clear()
{
ThrowNotSupported();
}

bool ICollection<T>.Remove(T item)
{
ThrowNotSupported();
return false;
}

object ICollection.SyncRoot
{
get
{
return m_Items;
}
}

bool ICollection.IsSynchronized
{
get
{
return true;
}
}

public bool Contains(T item)
{
return IndexOf(item) != -1;
}

public void CopyTo(T[] array, int arrayIndex)
{
m_Items.CopyTo(array, arrayIndex);
}

void ICollection.CopyTo(Array array, int index)
{
m_Items.CopyTo(array, index);
}

public int Count
{
get
{
return m_Items.Length;
}
}

public bool IsReadOnly
{
get
{
return true;
}
}

#endregion

#region IEnumerable<T> Members

public IEnumerator<T> GetEnumerator()
{
return ((IEnumerable<T>)m_Items).GetEnumerator();
}

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

#endregion
}

最佳答案

目前还没有支持;但这似乎是一个合理的场景。这取决于您所说的“开箱即用”的意思(评论);如果您的意思是“今天,没有更改代码”,则需要使用针对 DTO 的代理项,或将不可变列表公开为可变列表的垫片属性;如果你的意思是“向前移动”,我想我们可以看看列表构造函数,它采用(可取的)IEnumerable[<T>]或(不太可取,但可行)T[] , 然后在缓冲数据后简单地构造列表。

关于c# - 使用 protobuf-net 序列化不可变集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16330203/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com