相关疑难解决方法(0)

.NET中快速紧凑的对象序列化

我想使用对象序列化在Mono服务器和Silverlight客户端之间通过网络进行通信.序列化节省空间并且速度非常快非常重要,因为服务器将承载多个实时游戏.

我应该使用什么技术?BinaryFormatter为此应用程序中不需要的序列化类(版本,文化,类名,属性名等)增加了大量开销.

我能做些什么来提高空间效率?

.net c# serialization

57
推荐指数
5
解决办法
5万
查看次数

IEnumerable <Interface>的protobuf序列化

[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 …

c# protocol-buffers

6
推荐指数
0
解决办法
60
查看次数

是否可以在Silverlight中使用protobuf-net对私有财产进行反序列化?

众所周知,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)

protobuf-net

3
推荐指数
1
解决办法
3965
查看次数

标签 统计

c# ×2

.net ×1

protobuf-net ×1

protocol-buffers ×1

serialization ×1