【发布时间】:2013-12-31 22:09:10
【问题描述】:
我有以下带有通用方法的静态类,我想知道从不同的线程和不同的对象使用它是否安全?我不确定这在幕后是如何工作的,所以解释一下会有所帮助
public static class Serialization
{
public static byte[] Serialize<T>(T obj)
{
using (var ms = new MemoryStream())
{
Serializer.SerializeWithLengthPrefix<T>(ms, obj, PrefixStyle.Base128);
return ms.ToArray();
}
}
public static T DeSerialize<T>(byte[] bytes)
{
using (var ms = new MemoryStream(bytes))
{
return Serializer.DeserializeWithLengthPrefix<T>(ms, PrefixStyle.Base128);
}
}
}
【问题讨论】:
-
对我来说看起来不错。您有具体问题吗?
-
没有什么明显的线程不安全的。如果另一个线程在您序列化 obj 时对其进行了修改,那么您将遇到问题,与 bytes 相同,但可能性要小得多。
-
查看answer here 以获得更长的解释。简而言之:静态方法在默认情况下是线程安全的,只要它们不提交一些多线程巫术。
-
查看 protobuf 文档,如果
Serializer.SerializeWithLengthPrefix和Serializer.DeserializeWithLengthPrefix是线程安全的,那么 - 是的,您的代码是线程安全的。注意:静态方法应该是线程安全的,按照指南,但是检查:) -
@PTwr 更正确:静态方法应该是线程安全的,按照惯例。但是,它没有任何默认或自动。但在这种情况下:是的,它们是线程安全的。
标签: c# generics thread-safety protobuf-net