是否可以序列化包含yield语句的方法(或包含此类方法的类),以便在对类进行重新水化时,保留生成的迭代器的内部状态?
我已经看到了一些想法,而不是像创建,更新,插入,删除(CRUD)使用Get和Put.非常好.但是,我还没有看到如何处理复杂性.我被告知,"只需为您需要的每种查询类型编写一个方法".
在我开始考虑限定符(where子句)之前,大多数NOSQL似乎都没问题 - 可能会有很多变化.是否已经有一个很好的方案,以合理的方式实现限定符,只使用方法名称和参数约定?也许有某种动词/名词方案运作良好,但它本身并不是一种语言.
我不是在回答"正确"的答案......我希望我能从中学到一些思想流派.
发现RavenDB制造商的这篇博文:http://ayende.com/blog/4562/ravendb-index-management
我们可以在一个类上实现多个索引吗?
我甚至发现,有可能要序列化匿名委托http://blogs.microsoft.co.il/blogs/aviwortzel/archive/2008/06/20/how-to-serialize-anonymous-delegates.aspx 我想,如果这是可能的,他们可能会使用这样的东西.
但是,如果我们无法访问相同的程序集(例如Silverlight),该怎么办?在这里发现这篇文章:http: //ayende.com/blog/4766/accessing-ravendb-from-silverlight
IEnumerable<T>对象是客户端还是服务器端搜索的?在通过网络发送结果集之前,我们如何通过NOSQL来缩小结果集,而不将其锁定为一个唯一ID?
更新:我最终通过RavenDB向Ayende发送电子邮件.他善意回答了我的问题(如下):
你能做的就是写:
public IEnumerable<T> FindAll(Expression<Func<T,bool>> whereClause)
{
return session.Query<T>().Where(whereClause).ToList();
}
Run Code Online (Sandbox Code Playgroud)
这使用linq来计算你的意图,然后使用RavenDB的语法将查询发送到服务器.在服务器上,我们分析您的查询,查询优化器检查是否存在可以回答此查询的现有索引,如果没有,它将为您创建临时索引.
如果您足够查询该临时索引,RavenDB将使其永久化.因此,自我优化自己的运作.
您是否从"Silverlight"用例中获得了很大的帮助?
我们完全支持Silverlight.
RavenDB可以处理多个索引服务器端吗?
是.事实上,我们有一些客户有> 500个索引运行没有问题.
来自RavenDB的Ayende的信息结束
在设计的查询语言(即的FindAll /哪里/代表),蒙戈似乎通过JSON ......实现了一点这个http://www.mongodb.org/display/DOCS/Indexes 我希望我能知道更多关于它.
这听起来更接近:http://www.mongodb.org/display/DOCS/MapReduce
序列化在C#中序列化匿名委托的一个有趣的线程.这不是直接相关的...但我只是想稍微深入了解一下,所以我对潜力有了更多了解.
我认为目前的语言不存在这种支持.我认为我想做的事情可以通过"工作流引擎"来解决.但我对工作流程的问题通常是:
我已经研究了在C#中序列化迭代器,但这并没有让我到达我想要的位置.我目前正在考虑在Boo中组装一个DSL,但不确定我是否能够在Boo中获得类似coroutine的行为,并且能够将其序列化.
这是我想做的有限虚构的例子.主要问题是,在例程中的任何时候,您可能需要获得用户输入.输入之间的时间可能很长,因此需要将服务状态序列化为磁盘.
def RunMachine(user)
var lever = user.ChooseLever()
lever.Pull()
var device = CreateDevice(user)
machine.Add(device)
machine.Run()
def CreateDevice(user)
var color = user.ChooseColor()
var shape = user.ChooseShape()
return Device(color, shape)
Run Code Online (Sandbox Code Playgroud)
我在CPython中有一个工作"引擎".它捎带在python中的迭代器/ yield支持上.所以代码看起来像这样:
def escape(self, you):
roll = yield self.game.rollDice(you)
if roll < 5:
self.caughtAction(you)
Run Code Online (Sandbox Code Playgroud)
哪里rollDice可以打断.用一些用户动作.但是,CPython不会序列化迭代器.
由于游戏的整个状态可以定义为一系列命令,因此我将游戏状态序列化为协程开始的点,然后是剩余的命令列表.所以保存/恢复如下所示:
def dumpGameState(game):
if gameState.partialState:
return pickle.dumps({ 'partialState': game.partialState, 'partialInputs': game.partialInputs })
return pickle.dumps(game)
def loadGameState(data):
state = pickle.loads(data)
if state.__class__ is …Run Code Online (Sandbox Code Playgroud) 我的应用程序尝试反序列化客户端发送的数据,但失败并出现以下错误:
抛出异常:mscorlib.dll中的"System.Runtime.Serialization.SerializationException"
附加信息:无法获得成员'<.ctor> b__0'.
谷歌搜索没有结果.好吧,我决定进入反序列化逻辑,并试图找出导致这种情况的原因.嗯,有一天过去了,我离我很近了.
我使用Microsoft Reference Source网站上的说明来配置Visual Studio.它下载了一些东西
MicrosoftPublicSymbols\mscorlib.pdb\
DCF1E4D31F6944AC87E7A634262BEE881\mscorlib.pdb (780kb)
E47257B512BA49BC9FC367C532FC5F1E2\mscorlib.pdb (953kb)
Run Code Online (Sandbox Code Playgroud)
但是调试器没有介入.
我google了更多,并找到了另一种方法 - 安装dotTrace应用程序并将其用作源服务器.这也无济于事.我仍然看到以下内容:
Symbol Load Information mscorlib.pdb的弹出窗口说
C:\ Users\me\AppData\Local\Temp\SymbolCache\MicrosoftPublicSymbols\mscorlib.pdb\e47257b512ba49bc9fc367c532fc5f1e2\mscorlib.pdb:已加载符号.
我可以介入System.Windows.Forms,System.Linq等 - 所以一般来说,它可以工作 - 它只是这个特定的调用BinaryFormatter.Deserialize()不起作用.可能是什么原因以及如何让它进入?
可能是因为SecuritySafeCritical属性?
[System.Security.SecuritySafeCritical]
public Object Deserialize(Stream serializationStream)
Run Code Online (Sandbox Code Playgroud)
我正在使用VS 2015 .Net 4.5.2(虽然我试过4.5但结果相同).