我只是浪费了几个小时的调试才意识到与.NET相反,在.NET Core中,每次运行代码时,GetHashCode都会返回不同的值.我完全理解这个的基本原理.依赖哈希码值是一个非常糟糕的想法(比如序列化它们).我甚至记得微软(在Core之前)的.NET内部版本会改变每个版本的GetHashCode的行为,这样就没有人会对它感到太满意了.
说完这一切之后,我正在调试大量使用GetHashCode的复杂代码.我知道这个bug是我自己做的,与GetHashCode无关,但每次运行它都会失败.很烦人.有没有办法强制GetHashCode像在.NET中一样(我在调试时),而不必编写自己的哈希函数,并且必须在代码中的任何地方替换它?
使用protobuf-net v2 build 668,我正在尝试序列化/反序列化一个类,该类包含一个定义为接口的成员,同时进行即时转换.通常,代理方法可以正常工作,但由于C#不允许用户定义的接口转换,我无法定义转换.
谢谢,
namespace ProtoBufNetTest
{
using System.Diagnostics;
using System.IO;
using ProtoBuf;
using ProtoBuf.Meta;
class Program
{
static void Main()
{
RuntimeTypeModel.Default.Add(typeof(IDummy), false)
.SetSurrogate(typeof(DummySurrogate));
var container = new Container { Data = new Dummy { Positive = 3 } };
using (var file = File.Create("test.bin"))
{
Serializer.Serialize(file, container);
}
using (var file = File.OpenRead("test.bin"))
{
container = Serializer.Deserialize<Container>(file);
Debug.Assert(container.Data.Positive == 3);
}
}
}
// Outside of the project, cannot be changed
public interface IDummy
{
int Positive …Run Code Online (Sandbox Code Playgroud) 我相信这是 Gob 序列化的合法用例。但enc.Encode由于Something没有导出字段而返回错误。请注意,我不是Something直接序列化,而是仅Composed包含导出的字段。
我发现的唯一解决方法是将Dummy(导出的)值添加到Something. 这是丑陋的。有没有更优雅的解决方案?
https://play.golang.org/p/0pL6BfBb78m
package main
import (
"bytes"
"encoding/gob"
)
type Something struct {
temp int
}
func (*Something) DoSomething() {}
type Composed struct {
Something
DataToSerialize int
}
func main() {
enc := gob.NewEncoder(&bytes.Buffer{})
err := enc.Encode(Composed{})
if err != nil {
panic(err)
}
}
Run Code Online (Sandbox Code Playgroud) 在Go中,你不\xe2\x80\x99t声明你需要实现一个接口,你只需执行它(它\xe2\x80\x99s称为\xe2\x80\x98结构类型\xe2\x80\x99类似于\xe2 \x80\x98duck 在动态语言中输入 \xe2\x80\x99)。\n如果你想强制一个类型实现一个接口(比如当你 \xe2\x80\x98inherit\xe2\x80\x99 C# 中的接口或例如Java)?换句话说,如果忘记实现接口(或签名错误)是一个错误,并且您希望尽早发现该错误,该怎么办?最好的方法是什么?
\n