我想使用对象序列化在Mono服务器和Silverlight客户端之间通过网络进行通信.序列化节省空间并且速度非常快非常重要,因为服务器将承载多个实时游戏.
我应该使用什么技术?BinaryFormatter为此应用程序中不需要的序列化类(版本,文化,类名,属性名等)增加了大量开销.
我能做些什么来提高空间效率?
[ProtoContract]
class A
{
[ProtoMember(1)]
public B bbb
{
get;set; //getter & setter is here
}
}
[ProtoContract]
public class B : IData
{
///???0
[ProtoMember(1)]
public IEnumerable <IData> subData
{
get;set; //getter & setter is here
//the setter puts some data inn structure that in fact contains List<T> plus some simple int's
}
///????
public interface IData: Iface1
{
///????
IEnumerable<Iface3> data2 {get;}
///????
IEnumerable<IData> subdata{get;}
}
Run Code Online (Sandbox Code Playgroud)
当我尝试序列化一个类对象时,我得到一个错误:"没有为类型定义的序列化器:System.Collections.Generic.IEnumerable`1 [IData,namespaceMy,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null]
问题是 - 我怎么能序列化和反序列化IEnumerable?
将IEnumerable更改为List …
众所周知,Silverlight不允许私人反思。不过,我有一个带有私有设置器的公共财产,我需要能够序列化(这里没有问题)和反序列化(bummer)。
我知道世界上没有什么东西能使protobuf-net在Silverlight中写入此属性,这必须从客户端类型(或汇编,如果该属性为内部属性)中完成。
protobuf-net中是否存在针对Silverlight的方案,这使其成为可能?我可以使该类型实现一些专用的protobuf-net接口(例如,像IProtoSerializable)。
谢谢。
编辑
我可以提出这样的方案:
[ProtoMember(N, SetterMethod = "DeserializePropValue")]
public string property Prop
{
get { return m_prop; }
private set { m_prop = value; }
}
public void DeserializePropValue(ProtoValue<string> value)
{
m_prop = value.Value;
}
Run Code Online (Sandbox Code Playgroud)
ProtoValue类型是公共的,但其构造函数是内部的,因此只有protobuf-net程序集可以创建该类型的实例。当然,protobuf-net不会公开任何公共API来创建ProtoValue对象。
此方案仅可用于Silverlight平台,其他平台仅会调用私有设置程序。
你怎么看?
编辑2
我希望指出,可以肯定的是,仍然可以获取对任意PropValue <T>实例的引用,但这不是偶然的,这些是该属性的意外覆盖,我希望消除。另外,我想让设置器不公开,这样它就不会在UI中使用的各种基于反射的绑定机制中浮出水面。
编辑3
可以使PropValue <T>实例不适合存储,这意味着在方法DeserializePropValue返回之后,相应的PropValue实例将失效。这仅是滥用它的一种方法,如下所示:
[ProtoContract]
public class Abusee
{
[ProtoMember(1, SetterMethod = "DeserializePropValue")]
public string property Prop { get; private set; }
public void DeserializePropValue(ProtoValue<string> value)
{
m_prop = value.Value;
}
}
[ProtoContract]
public class Abuser
{
private …Run Code Online (Sandbox Code Playgroud)