标签: datacontract

树结构的序列化/ Derialization

我试图找出保存(序列化)和以后打开(反序列化)树结构的最佳方法.我的结构由具有不同属性的各种对象类型组成,但每个都继承自基本抽象"Node"类.

每个节点都有唯一的ID(GUID),并有一个AddSuperNode(Node nd)方法,用于设置节点的父节点.这反过来调用其他方法,允许父节点知道它具有哪些子节点.但是,某些节点还使用AddAuxSuperNode()方法向节点添加辅助父节点.

我正在使用二进制序列化,但现在我想我想使用一些我有更多控制的东西,并且序列化数据更容易访问.我还希望在反序列化时保留Type信息,并能够序列化私有值.所以DataContractSerializer似乎是最好的方式.

我不能只序列化的根节点直接因为有多个父节点.我不想创建重复的对象.所以我似乎需要将树解构为一个平面列表,然后将其序列化.然后在序列化该列表后重建树.这听起来不错吗?

就像我之前说的,每个节点都有一个唯一的GUID标识符,但是现在节点直接引用它们的父节点/子节点而不存储它们的id.我可以更新AddSuperNode()AddAuxSuperNode()方法,以便除了直接引用之外还更新要序列化的父ID列表.但是我宁愿只在序列化对象时更新/创建这个列表.所以我想在节点中创建一个UpdateSuperNodeIDRefs()方法,该方法将在序列化之前调用.

以下是我计划对此结构进行序列化和反序列化的操作.任何人都可以建议更好/更清洁/更有效的方法吗?

序列化

1)提供树结构的根节点

2)细分树结构成扁平字典(GUID ID,节点ND)其中IDGUIDND.

3)调用UpdateSuperNodeIDRefs() ; 为每个节点更新为其父节点保存的ID.

4)使用DataContractSerializer序列化节点字典

反序列化

1)反序列化节点字典

2)遍历字典中的每个节点,将每个节点重新连接到其父节点.对于存储的任何父ID,查找具有匹配ID 的字典中的相应节点调用AddSuperNode()AddAuxSuperNode()以将节点重新连接到其父节点.

3)从Dictionary中的任何节点找到结构的根

4)返回根节点

c# serialization datacontract datacontractserializer

5
推荐指数
1
解决办法
4718
查看次数

空值与未设置值

我们编写了一个Web服务,它使用一个简单的实体转换器将DTO的值映射回"真正的"服务器端业务对象.作为这个练习的一部分.我们在显式设置空值未设置值的客户端之间遇到了"有趣"的区别.

问题本质上是我们想要在客户端没有显式设置值的情况下在实际业务对象上设置默认值,但是使用标准可空类型无法判断客户端是否明确表示" 将此设置为null "或者只是不设置它.

这里的解决方案显然是某种"旗帜".

在业务对象中,我们可以使用属性设置器中设置的私有"IsDirty"标志在内部跟踪字段的状态,但是DTO只是真正指定了接口,因此这意味着将此数据公开给公众.这留下了许多实现选项.语言是C#(所以静态类型)所以......

  1. 我们可以在每个属性上公开一个"IsSet"标志吗?
  2. 我们可以将每个属性公开为具有.Value和.IsSet属性的类吗?等等

如何选择在数据合同中公开这些"标志"?你在这里认为最佳做法是什么?

对此的任何意见将不胜感激.

wcf design-patterns datacontract

5
推荐指数
1
解决办法
723
查看次数

我可以阻止特定数据库反序列化吗?

我有这样的数据提取

[DataContract]
class MyDC 
{
    [DataMember]
    public string DM1;

    [DataMember]
    public string DM2;

    [DataMember]
    public string DM3;
}
Run Code Online (Sandbox Code Playgroud)

有时我想,以防止DM2从一个OperationContract的返回时被反序列化.像这样的东西:

[OperationContact]
public MyDC GetMyDC()
{
    MyDC mdc = new MyDC();

    if (condition)
    {
        // Code to prevent DM2 from being deserialized  
    }

    return mdc;
}
Run Code Online (Sandbox Code Playgroud)

我总是可以创建一个只有DM1和DM3的新DataContract并从MyDC实例生成,但我想看看是否可以以编程方式删除DM2.可能吗?怎么样?

wcf serialization datacontract datamember

5
推荐指数
2
解决办法
5188
查看次数

将Java/JSON映射解码为F#对象

我将Java/JSON映射转换为可用的F#对象时遇到问题.

这是我的代码的核心:

member this.getMapFromRpcAsynchronously =
    Rpc.getJavaJSONMap (new Action<_>(this.fillObjectWithJSONMap))
    ()

member this.fillObjectWithJSONMap (returnedMap : JSONMap<string, int> option) = 
    let container = Option.get(returnedMap)
    let map = container.map
    for thing in map do
        this.myObject.add thing.key
        // do stuff with thing
    ()
Run Code Online (Sandbox Code Playgroud)

我的RPC方法返回的JSON如下所示:

{"id":1, "result":
    {"map":
        {"Momentum":12, "Corporate":3, "Catalyst":1},
     "javaClass":"java.util.HashMap"}
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试将其映射到F#DataContract,如下所示:

[<DataContract>]
type JSONMap<'T, 'S> = {
    [<DataMember>]
    mutable map : KeyValuePair<'T, 'S> array
    [<DataMember>]
    mutable javaClass : string
}

[<DataContract>]
type JSONSingleResult<'T> = {
    [<DataMember>]
    mutable javaClass: string
    [<DataMember>]
    mutable result: 'T …
Run Code Online (Sandbox Code Playgroud)

java f# json map datacontract

5
推荐指数
1
解决办法
1257
查看次数

REST与多态DataContracts - 反序列化失败

这一直让我疯狂,因为我没有做任何改变,但我发誓这是按照我昨天的方式工作.

我有一个使用以下合同定义的WCF 4 REST服务:

[ServiceContract]
public interface IPhoneFeaturesManagementHost
{
    [OperationContract]
    [WebInvoke(Method = "POST", UriTemplate = "/accounts/{accountNumber}/phoneNumbers/{phoneNumber}/features/{featureType}", RequestFormat = WebMessageFormat.Xml, ResponseFormat = WebMessageFormat.Xml, BodyStyle = WebMessageBodyStyle.Bare)]
    void UpdateFeatureStatus(string accountNumber, string phoneNumber, string featureType, FeatureUpdateRequest updateRequest);
}
Run Code Online (Sandbox Code Playgroud)

我还定义了以下类型:

[DataContract]
[KnownType(typeof(One900FeatureUpdateRequest))]
public abstract class FeatureUpdateRequest
{
    [DataMember]
    public FeatureStatus Status { get; set; }

    [DataMember]
    public DateTime EffectiveDate { get; set; }

    public string AccountNumber { get; set; }
    public string PhoneNumber { get; set; }
    public string UserId { get; set; } …
Run Code Online (Sandbox Code Playgroud)

.net c# rest wcf datacontract

5
推荐指数
1
解决办法
539
查看次数

JSON样本到[DataContract]

是否有任何工具允许基于JSON样本生成DataContract实体定义?我真的错过了使用代码生成工具的旧的优秀WSDL元数据.

c# serialization json datacontract datacontractjsonserializer

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

DataContractSerializer 将接口属性序列化为 System.Object / anyType

在应用程序中,我具有以下接口/实现结构:

public interface IMyInterface
{
  IMyOtherInterface InstanceOfMyOtherInterface { get; }
}

public interface IMyOtherInterface
{
  string SomeValue { get; }
}

[DataContract(Name = "MyInterfaceImplementation", Namespace = "")]
public class MyInterfaceImplementation : IMyInterface
{
  [DataMember(EmitDefaultValue = false), XmlAttribute(Namespace = "")]
  public IMyOtherInterface InstanceOfMyOtherInterface { get; private set; }

  public MyInterfaceImplementation()
  {
    this.InstanceOfMyOtherInterface = new MyOtherInterfaceImplementation("Hello World");
  }
}

[DataContract(Name = "MyOtherInterfaceImplementation", Namespace = "")]
public class MyOtherInterfaceImplementation : IMyOtherInterface
{
  [DataMember]
  public string SomeValue { get; private set; }

  public MyOtherInterfaceImplementation(string …
Run Code Online (Sandbox Code Playgroud)

.net serialization xml-serialization datacontract datacontractserializer

5
推荐指数
0
解决办法
1430
查看次数

如何使用 Json.Net 将 JsonProperty 属性分配给 DLL 内类的属性?

我在 DLL 中有一个类,它没有用DataContract, JsonProperty等标记。现在我想将该类的实例序列化为 JSON 对象,并缩短 C# 属性名称

例如,类是:

public class Foo
{
    public string SomeLengthyCSharpPropertyName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我想知道是否可以在 C# 名称和 json 名称之间创建映射。我不能直接添加如下DataContract, JsonProperty属性。有什么解决方法吗?

[DataContract]
public class Foo
{
    [JsonProperty("s")]
    public string SomeLengthyCSharpPropertyName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我倾向于不创建具有相同但JsonProperty修饰属性的另一个类并将属性复制到新类然后序列化。

c# json datacontract json.net

5
推荐指数
1
解决办法
4279
查看次数

使用 JsonConvert 进行序列化会丢失数据

我在我的项目中使用它是JsonConvert为了json从我的对象中创建一个字符串,但是发生了一些奇怪的事情,其中​​一个实体在这个过程中丢失了数据,这很奇怪,因为当我调试时,该实体具有值,但对于某些实体来说原因是它在这个过程中丢失。

我使用 JsonConvert.SerializeObject 方法,这是丢失数据的实体:

[DataContract]
public class MediaDTO : BaseEntityDTO
{
    [DataMember(IsRequired = true)]
    public int Id { get; set; }

    [DataMember(IsRequired = true)]
    public bool IsAlive { get; set; }

    [DataMember(IsRequired = true)]
    public string Description { get; set; }

    [DataMember(IsRequired = true)]
    public PidDTO Pid { get; set; }
}

[DataContract]
public class BaseEntityDTO
{ 
    [DataMember(IsRequired = true)]
    public bool IsDeleted { get; set; }

    [DataMember(IsRequired = true)]
    public DateTime AddedDate { get; set; …
Run Code Online (Sandbox Code Playgroud)

c# serialization json datacontract json.net

5
推荐指数
1
解决办法
2196
查看次数

(WCF)elementFormDefault ="qualified"和attributeFormDefault ="qualified"可能

情况:我需要构建一个基于XSD的Web服务.

当XSD说:时,可以创建一个WCF Web服务:

elementFormDefault="qualified" attributeFormDefault="qualified"
Run Code Online (Sandbox Code Playgroud)

要么

elementFormDefault="unqualified" attributeFormDefault="unqualified"
Run Code Online (Sandbox Code Playgroud)

我在Stackoverflow或Google上找不到任何明确的答案.这些可能之一或两者兼而有之吗?

如果可能,它是否可以与MessageContracts和DataContracts组合?

基于Microsoft它看起来不可能:

attributeFormDefault被忽略.

elementFormDefault必须是合格的.所有元素都必须符合DataContractSerializer支持的模式.这可以通过将xs:schema/@ elementFormDefault设置为"qualified"或通过在每个单独的元素声明上将xs:element/@ form设置为"qualified"来实现.

我也发现不喜欢它:

通常,由于单个文档中混合使用全局和局部元素可能会产生混淆和奇怪的语法,以及默认命名空间可能出现的问题,因此建议坚持使用elementFormDefault ="qualified".它可能更冗长,但是哪个命名空间/模式拥有给定元素也更清楚.如果XML文档作者想要减少前缀的数量,他们总是可以依赖"默认命名空间".此外,由于使用默认命名空间时可能存在冲突,因此attributeFormDefault应该是不合格的.

c# wcf xsd datacontract messagecontract

5
推荐指数
0
解决办法
369
查看次数