我正在尝试在PHP中实现自己的序列化/ var_dump样式函数.如果存在圆形阵列(有)的可能性似乎是不可能的.
在最近的PHP版本中,var_dump似乎检测到循环数组:
php > $a = array();
php > $a[] = &$a;
php > var_dump($a);
array(1) {
[0]=>
&array(1) {
[0]=>
*RECURSION*
}
}
Run Code Online (Sandbox Code Playgroud)
我如何在PHP中实现我自己的序列化类型的方法,可以类似地检测?我不能只是跟踪我访问过的数组,因为数组在PHP严格比较返回包含相同的元素,并比较圆形阵列导致致命错误,反正不同的阵列真.
php > $b = array(1,2);
php > $c = array(1,2);
php > var_dump($b === $c);
bool(true)
php > $a = array();
php > $a[] = &$a;
php > var_dump($a === $a);
PHP Fatal error: Nesting level too deep - recursive dependency? in php shell code on line 1
Run Code Online (Sandbox Code Playgroud)
我找了一种方法来找到一个数组的唯一id(指针),但我找不到一个.spl_object_hash仅适用于对象,而不适用于数组.如果我将多个不同的数组转换为对象,它们都会获得相同的spl_object_hash值(为什么?).
编辑:
在每个数组上调用print_r,var_dump或serialize,然后使用某种机制来检测这些方法检测到的递归的存在是算法复杂性的噩梦,并且基本上会使任何使用太慢而不能在大型嵌套数组上实用.
接受的回答: …
我正在编写一个应用程序来在对等网络中进行一些分布式计算.在定义网络时,我有两类P2PNetwork和P2PClient.我希望这些是通用的,因此有以下定义:
P2PNetwork<T extends P2PClient<? extends P2PNetwork<T>>>
P2PClient<T extends P2PNetwork<? extends T>>
Run Code Online (Sandbox Code Playgroud)
用P2PClient定义setNetwork(T网络)的方法.我希望用这段代码描述的是:
这似乎对我来说是正确的,但如果我尝试创建一个非泛型版本,如
MyP2PClient<MyP2PNetwork<? extends MyP2PClient>> myClient;
Run Code Online (Sandbox Code Playgroud)
和其他变种我从编译器收到很多错误.所以我的问题如下:
我有并且发布了循环参考.
我有Rest Webservices将对象返回到前端,问题是当我尝试返回具有多个引用的对象时,结果我得到无限响应,生成
java.lang.IllegalStateException:
Cannot call sendError() after the response has been committed
Run Code Online (Sandbox Code Playgroud)
这些对象是由Hibernate代码生成自动生成的,我需要在后端使用循环引用,我只需要在使用Jackson将信息发送到前端之前将其删除.
控制器方法标题是:
@RequestMapping(value="/list", method=RequestMethod.POST)
public @ResponseBody eventResponse list(@RequestBody String sessionID) {
Run Code Online (Sandbox Code Playgroud)
我没有做任何明确的转换为Json,我是一个新手,我认为杰克逊自动解决了这个问题.
想象一下国际象棋游戏的以下两类:
TChessBoard = class
private
FBoard : array [1..8, 1..8] of TChessPiece;
...
end;
TChessPiece = class abstract
public
procedure GetMoveTargets (BoardPos : TPoint; Board : TChessBoard; MoveTargetList : TList <TPoint>);
...
end;
Run Code Online (Sandbox Code Playgroud)
我希望在两个单独的ChessBoard.pas和ChessPiece.pas单元中定义这两个类.
如何避免我遇到的圆形单元参考(在另一个单元的接口部分需要每个单元)?
在Nodejs中,当我在console.log中有一个req对象时,[Circular]是什么意思?
这是针对基本nodejs示例的示例console.log(req).请注意,request.socket._readWatcher.socket是[Circular].这是否意味着它指的是自己?我该如何取消引用?
{ socket:
{ bufferSize: 0,
fd: 7,
type: 'tcp4',
allowHalfOpen: true,
_readWatcher:
{ socket: [Circular],
callback: [Function: onReadable] },
destroyed: false,
readable: true,
_writeQueue: [],
_writeQueueEncoding: [],
_writeQueueFD: [],
_writeQueueCallbacks: [],
_writeWatcher:
{ socket: [Circular],
callback: [Function: onWritable] },
writable: true,
_writeImpl: [Function],
_readImpl: [Function],
_shutdownImpl: [Function],
remoteAddress: '127.0.1.1',
remotePort: 40407,
server:
{ connections: 1,
allowHalfOpen: true,
watcher: [Object],
_events: [Object],
httpAllowHalfOpen: false,
type: 'tcp4',
fd: 5 },
ondrain: [Function],
_idleTimeout: 120000,
_idleNext:
{ repeat: 120,
_idleNext: [Circular], …Run Code Online (Sandbox Code Playgroud) 我想看看我是否可以初始化一个全局变量来指向自己:
#include <stdio.h>
struct foo { struct foo *a, *b; } x = { &x, &x };
int main()
{
printf("&x = %p, x.a = %p, x.b = %p\n", &x, x.a, x.b);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
此代码编译并按预期运行gcc(所有三个指针打印相同).
我想知道:
编辑:只是为了澄清,我质疑x其自己的初始化程序中的地址的可用性.
c gcc recursive-datastructures circular-reference static-initialization
使用引用计数时,有哪些可能的解决方案/技术来处理循环引用?
最着名的解决方案是使用弱引用,但是关于该主题的许多文章暗示也存在其他方法,但是不断重复弱引用示例.这让我想知道,这些其他方法是什么?
我不是问什么是引用计数的替代方法,而是使用引用计数时循环引用的解决方案是什么.
这个问题不是关于任何具体问题/实施/语言而是一般性问题.
有没有办法在Delphi中绕过循环单元引用?
也许是更新版本的delphi或某些魔法黑客或其他东西?
我的delphi项目有10万多行代码,主要基于单例类.我需要重构这个,但这意味着几个月的"循环引用"地狱:)
看一下Chrome堆快照的这一部分:
它显示了堆中对象的保留器,据我所知并且可以看到,它应该是垃圾,但是尽管如此,它仍然没有被收集.
毕竟,到根的"最短"路径是一条循环路径(它实际上从未到达根路径).令人不禁的是,快照查看器如何能够为它分配12的距离?这只是在放弃之前整个周期所采取的步骤数量吗?注意距离永远不会低于11.
我已经读过,可能需要几次迭代来清理带有循环引用的子图.但是重复强制收集(使用"时间轴"选项卡中的垃圾箱按钮)无法清除这些对象.
请注意,通过'185'引用进行探索最终会导致相同system / Context @862399,因此确实没有从根到此对象的路径(至少在此处不可见).
我疯了,还是垃圾收集器真的坏了?我不记得过去有过这个问题.我在Chrome 45.0.2454.101上.Beta 46.0.2490.64表现相同.
javascript garbage-collection google-chrome v8 circular-reference
我有一个具有几种不同类型的内部循环链接的数据结构,从cycle命令的意义上讲它是无限的.是否有任何有趣的模块可以将这些结构折叠成使用索引的平面数据结构?
我感兴趣的序列化完整的数据结构,既通过Read和Show以及通过Data.Serialize或相似.
构建顺序索引显然有很好的功能,但基于内存地址哈希值的索引也可以正常工作.