我有以下课程:
public class TriGrid
{
    private List<HexTile> _hexes;
    //other private fields...
    //other public proprerties
}
我的目标是仅序列化_hexes字段,因此我创建了以下ContractResolver:
internal class TriGridContractResolver : DefaultContractResolver
{
    protected override List<MemberInfo> GetSerializableMembers(Type objectType)
    {
        return new List<MemberInfo> { objectType.GetMember("_hexes", BindingFlags.NonPublic | BindingFlags.Instance)[0] };
    }
}
当我想序列化TriGrid的一个实例时,我做了:
var settings = new JsonSerializerSettings()
{
    ContractResolver = new TriGridContractResolver()
};
var json = JsonConvert.SerializeObject(someTriGrid, settings);
string strintJson = json.ToString();
但当我检查的价值strintJson总是"{}".该_hexes具有的元素,它不是空的.如果我序列化一个特定的HexTile它按预期工作.我在这做错了什么?
我正在尝试制作通用列表的深层副本,并且想知道是否有任何其他方法然后创建复制方法并实际上一次复制每个成员.我有一个看起来像这样的课程:
public class Data
{            
    private string comment;
    public string Comment
    {
        get { return comment; }
        set { comment = value; }
    }
    private List<double> traceData;
    public List<double> TraceData
    {
        get { return traceData; }
        set { traceData = value; }
    }
}
我有一份上述数据清单,即List<Data>.我要做的是将List子集的跟踪数据绘制到图形上,可能需要对数据进行一些缩放或扫描.我显然不需要在列表中绘制所有内容,因为它们不适合屏幕.
我最初尝试使用该List.GetRange()方法获取列表的子集,但似乎底层List<double>是浅层复制而不是深度复制.当我使用List.GetRange()再次获取子集时,我获得了先前修改过的数据,而不是其他地方检索到的原始数据.
任何人都可以给我一个如何处理这个问题的方向吗?非常感谢.
我有一些内部属性的类,我想将它们序列化为json.我怎么能做到这一点?例如
public class Foo
{
    internal int num1 { get; set; }
    internal double num2 { get; set; }
    public string Description { get; set; }
    public override string ToString()
    {
        if (!string.IsNullOrEmpty(Description))
            return Description;
        return base.ToString();
    }
}
使用保存它
Foo f = new Foo();
f.Description = "Foo Example";
JsonSerializerSettings settings = new JsonSerializerSettings() { TypeNameHandling = TypeNameHandling.All };
 string jsonOutput = JsonConvert.SerializeObject(f, Formatting.Indented, settings);
 using (StreamWriter sw = new StreamWriter("json_file.json"))
 {
     sw.WriteLine(jsonOutput);
 }
我明白了
{  
"$type": "SideSlopeTest.Foo, SideSlopeTest",
"Description": …如何自定义Json.NET以序列化私有成员而不是序列化公共只读属性(不使用属性).
我创造了一个习惯,IContractResolver但我有点失落.
我想通过将DbCompiledModel缓存到磁盘来减少EF6中的启动时间.
为DbContext编写EDMX文件很容易:
EdmxWriter.WriteEdmx(myDbContext, XmlWriter.Create(@"C:\temp\blah.xml"))
并且很容易将DbCompiledModel传递给DbContext:
var db = new DbContext(connectionString, myDbCompiledModel)
但是,似乎没有任何方法可以将EDMX文件从磁盘读入DbCompiledModel!我怎样才能做到这一点?
请注意,我已在此分支版本的EF6中使用EdmxReader工具成功实施了该解决方案:
https://github.com/davidroth/entityframework/tree/DbModelStore
但是,我不愿意在生产环境中使用分支版本.我试过从这个分支中提取EdmxReader实用程序,但它依赖于我无法访问的DbCompiledModel的内部构造函数.
那么,我如何从磁盘获取EDMX文件并将其转换为DbCompiledModel?
我遇到了一个问题,我的JSON序列化程序因为角色<不时出现而随机失败.我无法确定它来自何处,我想 - 在异常时 - 使用不同的方法重新编译,以便我可以看到有问题的对象的完整表示.有没有办法做到这一点?  
我目前的代码:
// data is of type 'object'
serialized = JsonConvert.SerializeObject(data, new JsonSerializerSettings() {
    Error = delegate(object sender, ErrorEventArgs args) {
        // reserialize here and output object so I know what the heck is going on
    }
})
我正在使用 Json.NET 进行序列化,但结果字符串太长了,因为它包含大量关于我没有用的程序集的多余信息。
例如,这是我得到的其中一种类型:
"Assets.Logic.CompGroundType, Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null": {
"$type": "Assets.Logic.CompGroundType, Assembly-CSharp",
"GroundType": 1,
"EntityID": 1,
"<GroundType>k__BackingField": 1
}
“GroundType”是一个枚举,而“EntityID”是一个整数。
这是我想要的结果:
"Assets.Logic.CompGroundType" : {
"$type": "Assets.Logic.CompGroundType",
"GroundType": 1,
"EntityID": 1,
"<GroundType>k__BackingField": 1
}
如果可能的话,我还想删除“$type”字段,同时仍然正确地反序列化继承的类型(我不确定为什么有必要,因为该信息是从上面的一行复制的,但是如果我通过设置 TypeNameHandling 删除它.None,我收到子类型的反序列化错误)。我也不确定最后一个字段 (k__BackingField) 是做什么用的。
如果可能的话,我想进一步减少它:
"Assets.Logic.CompGroundType" : {
"GroundType": 1,
"EntityID": 1,
}
我知道可以为 Json.Net 中的每种类型手动自定义序列化方案,但我有数百种类型,所以我想通过一些全局设置自动完成。
我尝试更改“FormatterAssemblyStyle”,但是那里没有“None”选项,只有“Simple”或“Full”,而且我已经在使用“Simple”。
在此先感谢您的帮助。
编辑:
重要的是要注意类型是字典中的键。这就是该类型出现两次的原因(在第一个示例的第一行和第二行)。
实现自定义 SerializationBinder 后,我能够减少“$type”字段的长度,但不能减少 Dictionary 键字段的长度。现在我得到以下信息:
"componentDict": {
      "Assets.Logic.CompGroundType, Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null": {
        "$type": "Assets.Logic.CompGroundType",
        "GroundType": 1,
        "EntityID": 1,
        "<GroundType>k__BackingField": 1
      }
    }
编辑2:
我试图序列化的代码是一个 …
我在SO处找到了许多解决方案,而且是通过序列化/反序列化(进入内存和后退)来处理对象的深层克隆.
它要求克隆的类标记为[Serializable].我碰巧把我的类(大部分都是)标记为[DataContract]因为我使用DataContractSerializer序列化为XML.
我只介绍了[Serializable]属性,因为需要对其中一些类实例进行深度克隆.但是,现在通过DCS进行序列化/反序列化的事情发生了,因为它不再起作用了 - 关于在反序列化时期望不同的XML元素的错误.如果我删除了[Serializable]错误消失了.
我有什么选择?我只想尽可能简单地深入克隆我的对象.
我在数据库中有二进制序列化对象。它们是用 protobuf 序列化的。现在我需要生成一些查看器来查看数据库的内容。所以,我从数据库读取流并将其反序列化回对象。它有效,结果是对象列表:
var dbData = readData(someType);//it is IList collection
现在,我想将此对象列表保存到文件中以查看数据库的内容。我认为最好将其保存为 xml。所以,我试过:
var serializer = new XmlSerializer(dbData.GetType());
但我收到一个错误:无法反序列化类型“My.Entities.IdBase”,因为它包含没有公共 setter 的属性“Key”。
现在怎么办?我无法将类定义更改为具有 setter。我应该将对象保存为 json 还是纯文本?或者我应该提取所有属性和值并将其保存到某个 xml 中?任何代码示例?
我正在尝试序列化一个由许多继承自IMyDataType.
public abstract class IMyDataType<T>
{
    protected virtual T Data { get; set; }
    public abstract String ToString(String args = null);
    public abstract Boolean SetValue(T newValue);
    public abstract Boolean CheckValue(T newValue);
    public abstract T GetValue();
}
例如我可能有一堂课MyInteger
public class MyInteger : IMyDataType<int>
{
    public int Min { get; protected set; }
    public int Max { get; protected set; }
    protected override int Data { get; set; }
    public MyInteger(int value)
    {
        Min = int.MinValue;
        Max = int.MaxValue; …