我有两个组件A和B.
A现有对B的引用,必须保持这种方式.现在我对B进行了一些需要引用A的更改.因此发生循环引用.
一点细节:
A有一些属性网格,B中的对话框需要托管.因此,为了避免这个循环引用问题,我尝试在A&B都引用的第三个程序集中定义网格的接口,并且使B仅引用接口.
我面临的两个问题:
在A内部定义的网格内部有太多的自定义数据类型(特定属性),我必须为它们中的每一个定义接口.
我看到这个例子与函数参数一起工作,例如通过传入的接口调用目标函数.但是考虑到下面的代码它会如何适合 - 我不能新建一个ICustomPropertyGridWrapper ...
object = new CustomPropertyGridWrapper(...)
m_property.SelectedObject = object;
我想在ASP.NET中构建一个具有3层架构的Web应用程序.但是我遇到了循环引用的问题.
我有3层:
- 包含UI的应用层.
- 包含所有逻辑和域类的业务层.
- 包含所有数据库交互方法的数据层.
我在业务层中使用数据层方法来执行数据库操作,在这些方法中,我需要将域类对象传递给数据层,但由于循环引用而无法完成.
例如,我有一个Person包含一些属性和方法的域类.现在我想将其Person插入数据库.我在Person类中有一个方法,命名为InsertPerson().在这个方法体中,我必须调用Data层的函数插入到数据库中.但是我无法将整个人对象传递到数据层方法,因为数据层引用被添加到业务层,反之亦然.
那我怎么能避免这个问题呢?请建议.
我正在用C#编写一个Web API项目,它使用Entity Framework从数据库中提取数据,将其序列化并发送给客户端.
我的项目有2个类,Post和Comment(来自Post的外键).
这些是我的课程.
发布课程:
public partial class Post
{
public Post()
{
this.Attachment = new HashSet<Attachment>();
this.Comment = new HashSet<Comment>();
}
public int PostId { get; set; }
public string Title { get; set; }
public string Content { get; set; }
public System.DateTime Created { get; set; }
public Nullable<System.DateTime> Modified { get; set; }
public virtual ICollection<Attachment> Attachment { get; set; }
public virtual ICollection<Comment> Comment { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
评论类:
public partial class Comment …Run Code Online (Sandbox Code Playgroud) serialization entity-framework circular-reference asp.net-mvc-4 asp.net-web-api
JSON.NET通过使用以下设置保留所有引用来支持循环引用序列化:
JsonSerializerSettings settings = new JsonSerializerSettings();
settings.ReferenceLoopHandling = ReferenceLoopHandling.Serialize;
settings.PreserveReferencesHandling = PreserveReferencesHandling.All;
Run Code Online (Sandbox Code Playgroud)
这允许以下代码无错误地运行,正确地序列化和反序列化对象及其自引用完整.
public class SelfReferencingClass
{
public string Name;
public SelfReferencingClass Self;
public SelfReferencingClass() {Name="Default"; Self=this;}
}
SelfReferencingClass s = new SelfReferencingClass();
string jsondata = JsonConvert.SerializeObject( d, settings );
s = JsonConvert.DeserializeObject<SelfReferencingClass>( jsondata, settings );
Run Code Online (Sandbox Code Playgroud)
jsondata字符串如下所示:
{"$id":"1","Name":"Default","Self":{"$ref":"1"}}
Run Code Online (Sandbox Code Playgroud)
问题是......如果没有可以解释这些引用的相应客户端JavaScript库,JSON.NET的这个特性是如何有用的,并且还支持编码这样的引用本身?
什么客户端库(例如JSON.stringify)使用"$ id"和"$ ref"字段支持此功能/编码?如果不存在,是否有一种已知的方法来添加对现有库的支持?
自己添加支持将是一个非常简单的双通过程.首先,反序列化整个字符串,并在创建每个对象时使用其"$ id"值作为键将其添加到字典中.当您遇到引用(仅包含"$ ref"属性的对象)时,您可以将其添加到object + fieldname列表中,您可以通过在已创建对象的最终字典中查找其键来返回以替换每个遇到的引用.
serialization json jsonserializer json.net circular-reference
当我进入Uncaught TypeError: Converting circular structure to JSON一个大型结构时,很难找到圆形参考的确切位置.
有没有一种简单的方法来查找/调试数据结构中的循环元素?
我正在使用JSON文件并在Swagger 2.0 Parser和验证器上验证 它验证它但是给出了循环引用的错误,是否有任何免费工具或网站来检测文件中循环引用的位置.
从这里查看以下代码.
它是关于在wcf中序列化时在数据提取(对象模型,对象图,域模型)中保留循环引用.
class ReferencePreservingDataContractSerializerOperationBehavior
:DataContractSerializerOperationBehavior
{
public ReferencePreservingDataContractSerializerOperationBehavior(
OperationDescription operationDescription)
: base(operationDescription) { }
public override XmlObjectSerializer CreateSerializer(
Type type, string name, string ns, IList<Type> knownTypes)
{
return CreateDataContractSerializer(type, name, ns, knownTypes);
}
private static XmlObjectSerializer CreateDataContractSerializer(
Type type, string name, string ns, IList<Type> knownTypes)
{
return CreateDataContractSerializer(type, name, ns, knownTypes);
}
public override XmlObjectSerializer CreateSerializer(
Type type, XmlDictionaryString name, XmlDictionaryString ns,
IList<Type> knownTypes)
{
return new DataContractSerializer(type, name, ns, knownTypes,
0x7FFF /*maxItemsInObjectGraph*/,
false/*ignoreExtensionDataObject*/,
true/*preserveObjectReferences*/,
null/*dataContractSurrogate*/);
}
} …Run Code Online (Sandbox Code Playgroud) 我有一张带有属性的表(ID int、SourceID int、TargetID int、TargetType int)
ID 源ID 目标ID -------------------- 1 123 456 2 456 789 3 1 123 4 456 1 5 2 1
我想找出所有循环引用。我想为此编写 PL/pgsql 函数。
这里 ID 4 的循环引用 = 456 1 123 456
我想找到这样的例子。谁能建议我如何进行此操作。
所以,我在一个文件中有这两个数据类:
@dataclass
class A:
children: List[B]
@dataclass
class B:
parent: A
Run Code Online (Sandbox Code Playgroud)
,这可以通过使用该__future__.annotations功能来实现。
然后我有另外两个文件,每个文件都有一堆对于我的项目来说是静态的每种类型的对象。
文件objects_A:
import objects_B
obj_a1 = A(
children=[
objects_B.obj_b1,
objects_B.obj_b2
]
)
Run Code Online (Sandbox Code Playgroud)
文件objects_B:
import objects_A
obj_b1 = B(
parent=objects_A.obj_a1
)
obj_b2 = B(
parent=objects_A.obj_a1
)
Run Code Online (Sandbox Code Playgroud)
显然,文件之间存在循环依赖问题,但即使它们位于同一个文件中,它也不起作用,因为一种类型的变量依赖于另一种类型的变量才能成功。
初始化B内部对象obj_a1也不起作用,因为self这里没有概念。
目前,我设置parent为None(针对类型提示),然后循环进行设置obj_a1:
for obj_b in obj_a1.children:
obj_b.parent = obj_a1
Run Code Online (Sandbox Code Playgroud)
大家有什么好主意吗?
不知道它是否有帮助,但是这些对象是静态的(它们在这些声明之后不会改变)并且它们具有某种父子关系(正如您肯定已经注意到的那样)。
如果可能的话,我希望将每种类型的变量放在不同的文件中。
python forward-declaration circular-reference python-3.x python-dataclasses
main.swift在 Xcode Version 13.3 (13E113) 中创建一个全新的 macOS Command Line Tool 项目,并用以下代码替换内容:
import Foundation
enum StructA {
// case case1(value: StructB)
case case2(expr: StructB)
}
indirect enum StructB {
case case3
case case4(expr: StructB)
}
Run Code Online (Sandbox Code Playgroud)
导致以下编译时错误:
<unknown>:0: error: circular reference
/Users/alextj/projects/TestProject/main.swift:8:15: note: through reference here
indirect enum StructB {
^
<unknown>:0: note: through reference here
Run Code Online (Sandbox Code Playgroud)
但是,如果取消case1注释该行,则循环引用错误就会消失!
所以下面的代码编译没有错误:
<unknown>:0: error: circular reference
/Users/alextj/projects/TestProject/main.swift:8:15: note: through reference here
indirect enum StructB {
^
<unknown>:0: note: through reference here
Run Code Online (Sandbox Code Playgroud)
为什么? …
c# ×3
json ×2
3-tier ×1
asp.net ×1
enums ×1
javascript ×1
json.net ×1
plpgsql ×1
postgresql ×1
python ×1
python-3.x ×1
recursion ×1
sql ×1
swift ×1
wcf ×1