如何在不创建对象的情况下使用C#序列化Guid?

时间:2016-12-15 11:21:39

标签: c# serialization json.net

我希望将我的Guids序列化为简短的Guid(as seen here)。为了完全兼容,我希望ShortGuid类序列化为简短形式,而不是长形式。

我已经尝试了using custom serialization,但我似乎无法将整个对象序列化为短字符串,只能进入包含字符串的对象。这就是我尝试过的:

var guid = new ShortGuid(Guid.NewGuid());
var str = JsonConvert.Serialize(guid);

哪个有效,但如果我序列化它:

{ Guid: "xxxxxxxxxxxxxxxxxx" }

我得到的序列化字符串如下所示:

xxxxxxxxxxxxxxxxxx

虽然序列化字符串I WANT只是

GetRichTextBox()

我已经扭转了局面,但无法实现这一目标。怎么办呢?

注意:我不希望这只适用于JsonConvert,这只是一个例子。我希望这个类能够正确地序列化。

2 个答案:

答案 0 :(得分:1)

这对我来说很完美:

public class GuidShortGuidConverter : JsonConverter
        {
            public override bool CanConvert(Type objectType)
            {
                return objectType == typeof(Guid);
            }

            public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
            {
                var shortGuid = new ShortGuid(reader.Value.ToString());
                return shortGuid.Guid;
            }

            public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
            {
                var customValue = new ShortGuid((Guid) value);
                writer.WriteValue(customValue.ToString());
            }
        }

答案 1 :(得分:0)

你想要的不是序列化而是隐式转换。 序列化适用于结构化键/值基础,具体取决于序列化类型。

使用隐式字符串转换

public static implicit operator string(ShortGuid shortGuid)
{
   return Encode(sh.Guid);
}

您可以使用

var guid = new ShortGuid(Guid.NewGuid());
string str = guid;