假设我有一个Person类。它有一个可编辑的Notes属性 我想将Person实例序列化为固定大小的缓冲区,因此Notes不能无限长 在UI中,我使用TextBox让用户编辑笔记。我想动态更新一个标签,说明你可以写多少个字符。
这是我目前的实现,有没有更快的方法? (我正在使用rs282)
public Int32 GetSerializedLength()
{
Byte[] data;
using (MemoryStream ms = new MemoryStream())
{
Serializer.SerializeWithLengthPrefix<Person>(ms, this, PrefixStyle.Base128);
data = ms.ToArray();
}
using (MemoryStream ms = new MemoryStream(data))
{
Int32 length = 0;
if (Serializer.TryReadLengthPrefix(ms, PrefixStyle.Base128, out length))
return length;
else
return -1;
}
}
编辑:我对序列化数据的内部长度和序列化数据的总长度感到困惑。
这是我的最终版本:
private static MemoryStream _ms = new MemoryStream();
public static Int64 GetSerializedLength(Person person)
{
if(null == person) return 0;
_ms.SetLength(0);
Serializer.Serialize<Person>(_ms, person);
return _ms.Length;
}
答案 0 :(得分:1)
通过编辑,听起来你想要没有序列化它的长度(因为如果你想要 序列化它的长度,你只需序列化它并检查它.Length
)。
基本上,没有 - 这是不可用的。我知道其他一些实现急需构建这些数据,即部分,因为它们一直在构建缓冲数据,其中protobuf-net从对象图中工作。
protobuf-net 不这样做 - 它通过发现在对象图上的单次传递中构建数据。你有什么特定的目的吗?事情总是可以添加(虽然努力)。
重新发出您不希望超量的音符(字符串)字段;作为一个完整性检查,请注意protubuf使用UTF8或字符串数据,所以个人我会这样做:
if(theText.Length > MAX || Encoding.UTF8.GetByteCount(theText) > MAX
|| GetSerializedLength(obj) > MAX)
{
//
}
请注意,在明显的情况下,我们已经更便宜地检查了这一点