►
From YouTube: .NET Design Review: AsnReader/Writer update
Description
00:00:00 - Approved: AsnReader/Writer updates https://github.com/dotnet/apireviews/pull/119
00:57:21 - Approved: Extend default value handling in JsonSerializer https://github.com/dotnet/runtime/issues/35649#issuecomment-625418116
01:07:08 - Approved: Add mechanism to handle circular references when serializing https://github.com/dotnet/runtime/issues/30820#issuecomment-625444164
A
A
C
D
E
Try
and
limit
it
to
one
okay,
so
this
is
the
changes
from
rounds.
One
and
two
of
when
we
were
talking
about
this
feature,
the
biggest
one
from
round
two
will
be
where
got
rid
of
the
ASN
value
reader
and
replaced
it
with
a
bunch
of
static,
helper
methods.
So
a
lot
of
this
should
be
easy
and
just
making
sure
we're
happy
with
the
shape,
but
then
that
the
new
ASN
decoder
class
will
be
a
little
bit
bigger.
The
biggest
change
is
we
talked
about
at
the
end
of
last
Thursday's
meeting
the
the
namespace.
E
E
E
C
A
A
E
As
part
of
the
cross-platform
work,
we've
had
to
do
more
and
more
manual
parts
and
to
get
consistent
answers
between
Windows,
Mac
and
Linux,
and
so
this
this
coming
out
is
just
a
full
product.
It
was
an
evolution
of
that.
So
when
I
wrote
up
the
original
proposal
or
the
original
code,
it
had
cryptographic
exception
when
I
brought
it
up
for
the
previous
proposal.
I
had
cryptographic
exception,
which
made
sense
because
we
were
burying
it
under
cryptography,
but
didn't
we
be
lifted
it
out
of
cryptography
cuz?
It
didn't
really
belong
there
right.
So.
B
E
A
E
E
F
A
E
E
E
The
state
information
goes
away,
which
is
the
first
block
of
removed
members,
and
then
now
we
got
will
start
seeing
the
shape
of
everything
else.
So
reading
coded
value
used
to
take
no
parameters
because
it
just
used
the
constructor
State.
Now
the
data
which
is
now
named
source
and
rule
set
are
now
formal
parameters
to
read
encoded
value
and
every
every
member
on
this
class
will
out.
E
B
You
say
that
the
only
reason
you're
not
using
ranges,
because
it
wasn't
that
standard
compatible,
correct,
so
another
tick
in
the
column,
for
we
really
should
consider
making
it
that
standard
compatible,
because
we
have
other
projects
that
are
running
into
the
exact
same
issue.
Where
we're
contorting
the
API
surface,
to
work
around
the
fact
that
the
type
doesn't
exist
at
level.
Yeah.
A
A
E
E
A
E
Yeah
right
and
that's
I
think
the
only
place
that
range
would
have
shown
up,
and
so
it's
an
offset
in
the
length
instead
of
a
compacted
range.
So
it
doesn't
really
change
much.
Just
if
range
was
in
that
standard,
oh
I
would
have
used
it
here
cur.
How
does
the
offset
work?
Is
it
not
at
the
beginning
of
source,
so
in
Assen,
or
rather
bur
encoded
data?
E
The
first
byte
will
be
this:
the
first
byte
in
the
tag,
which
is
the
return
value
which
and
that
could
have
been
multiple
bytes
and
then
the
lengths
telling
you
how
long
the
content
is
could
have
been
multiple
bytes
and
then
and
then
now
you
are
at
the
first
byte
of
the
content.
So
content
offset
will
generally
be
two
for
a
small
value
and
maybe
up
to
eight
or.
F
F
E
For
things
so
read,
boolean
being
the
simplest
of
all
the
things
that
you
can
read,
so
you
give
it
a
source
and
a
rule
set,
and
then
it
will
out
the
bytes
consumed,
which
is
how
much
you
need
to
move
forward
to
get
to
the
next
value
and
it
it
like
all.
The
other
read
methods
that
are
for
a
data
type
asterisk,
take
a
defaulted
knowable
asn.1
tag,
so
the
default
or
null
being
used,
the
universal
type
that
appropriate
to
this
data
type
and
any.
E
E
E
And
yeah,
so
that's
gonna,
be
the
general
shape
of
everything
here
is
took,
so
the
value
reader
had
the
same
shape
as
the
reader
apply
the
transformation
and
then
the
the
same
stuff
here
of
the
constructor
parameters
become
the
first
two
normal
parameters,
except
for
the
try
copy
where
destination
or
I
follow
the
rule.
The
destination
always
follows
source,
so
its
source
destination
will
set.
E
Yeah
there
was
the
suggestion
to
use
bit
array
as
or
it
as
a
supported
type
for
aimed
bit
list
values.
So
that's
on
here
as
well,
so
renamed
bit
list
yada-yada-yada
returning
a
bit
array
again.
If
we,
if
this
round,
we
want
to
say
no
actually
we
hate
that
type,
don't
add
it.
Then
deleting
things
is
certainly
easy.
E
E
B
E
The
multibyte
compacted
format,
slash
lacks
format
for
BER,
but
you
could
reason
about.
Oh
this
tag
would
have
been
this
long,
so
I
know
that
bytes
two
through
five
were
the
length
like
you
could
make
a
painter
for
it,
but
and
you
would
understand
the
length
because
we
told
you
the
content
length,
so
it
can
all
be
semantically
done
just
some
of
it's
a
little
ugly.
E
E
So
I
there
was
some
feedback
on
the
design
of,
in
particular
for
read
UTC
date,
where
we
have
a
parameter
of
what's
your
two-digit
year
max
and
for
reading,
a
set
of
where
we
have
the
option
of
skip
sort
validation
that
it
would
be
nice
to
encode
those
as
state
in
the
reader.
So,
in
addition
to
the
simple
constructor
that
takes
the
encoding
rules,
there's
now
a
s
and
reader
options,
which
is
the
encoding
rules
plus
those
two
things.
E
E
Yeah
we
have
to
scroll
down
again
because
I
did
this
like
a
week
or
two
ago:
I,
don't
remember
if
I
made
it
mutable
so
that
you
could
use
easy
initializer
patterns
because
then
it
only
featured
hasn't
shipped
yet
or
not,
but
I
know
that
definitely
the
reader.
This
constructor
shreds
the
reader
options
into
values
that
it
once
I
think
I
did
make
it
rewrite
so
that
you
could
use
object.
Initializer,
okay,.
B
G
E
B
G
E
Uhh
well,
I
mean
the
struct
you'd
have
like
it's,
not
a
default
construct,
you'd
have
to
say,
II
fall
to
base
and
reader
options.
You
could
say
defaults
of
rule
set.
If
you
want
I,
don't
expect
anyone
to
use
default
to
vase
and
reader
options.
The
the
type
does
have
I
mean
it'll
always
have
a
parameterless
constructor,
because
it's
struct,
but
you.
B
E
B
It
just
seemed
odd
to
me
that
I
could
that
I
could
call
the
constructor
overloaded,
ASN
reader,
passing
a
new
AS,
andrea
options,
parameterless
constructor,
so
I
don't
have
to
specify
the
rules,
but
if
I
call
the
constructor
that
explicitly
takes
your
rules,
I
have
to
specify
it
like
that.
That
just
seemed
like
a
disconnected
me,
but
if
we
don't
expect
anybody
to
ever
call
the
parameter.
Let's
constructor
on
this
truck
and
yeah
yeah.
E
Is
it
least
trying
to
make
it
look
like
you
have
to
always
have
specified?
One
default,
of
course,
is
always
a
valid
sim
default
of
T
is
always
a
valid
expression.
Default
is
sometimes
a
valid
expression
right.
So
then,
again
on
this
one,
we
see
the
general
shape
of
there
used
to
be
over
loads
of
thing
and
thing.
Taking
a
tag
is
the
first
parameter
now
it's
thing,
or
only
one
thing
which
takes
a
tag
as
the
last
parameter
defaulted
to
default,
which
means
use
the
appropriate
tag.
E
E
Okay,
so
read
set
of
and
read
UCT
time
UTC
time,
which
are
both
in
the
center
of
the
screen
right
now.
So
these
both
have
overloads
still
the
simple
overload,
which
just
has
the
nullable
tag.
It
will
use
the
value
that
was
specified
from
a
us
and
reader
options
and
the
if
you
don't,
if
you
want
a
specific
two-digit
year
max
for
this
call
to
read
UTC
time,
then
you
can
specify
it
as
a
formal
parameter.
E
Similarly,
with
read
set
of
it'll
use
the
options
the
default
is
false,
meaning
it
will
validate
sort
order,
validation
if
the
encoding
rules
required
sort
or
sets
to
be
sorted
correctly
and
to
digit
your
max
is
whatever
the
right
answer
is
for
x.509
certificates,
since
max
is
inclusive.
I
think
it's
twenty
forty,
nine.
E
E
B
B
B
So,
if
one
more
quick
question
on
that
done,
so
if,
if
I
have
a
value,
say,
10
billion
encoded
in
the
incoming
ASM
structure
and
I
call
try
to
try,
read
into
32
it's
going
to
return
false
if
it
has
a
well-formed
value
of
ten
billion
inside
of
it
right
right
does.
Is
the
internal
state
of
the
reader
mutated
by
that
operation?
Like
can
I
call,
try,
read
you
in
64
and
expect
that
to
succeed,
or
did
it
skip
if
the
try
returns.
E
E
It
throws
an
exception,
because
the
tag
is
wrong.
Then
the
state
is
not
modified
if
it
throws
and
if
it
throws
an
exception.
I
guess
if
it's
overthrows
an
ASN
content
exception,
the
state
is
not
modified.
If
it
throws
a
weird
exception,
then
it's
in
a
weird
state,
but
in
general
slicing
is
the
is
I
mean.
Actually
I
can
tell
you
from
the
representation.
It
always
calls
the
decoder
if
the
decoder
succeeds
it
slices.
So
in
this
case,
with
the
way
it's
implemented,
it
either
is
not
modified
or
or
any
exception.
B
The
reason
I
asked
is
I
feel
it
some
customer
questions
over
the
past
few
months
about
like
hey.
Is
it
safe
to
try
catch
this
operation
and
then
call
back
into
the
reader
or
back
into
the
writer
and
I
responded
with
normally
when
an
instance
method
on
a
type
throws
an
exception.
We
say
that
that
instance
is
dead
at
that
point
normally,
but
if
we
want
to
make
other
guarantees
here,
we
should
just
document
them.
That's.
B
D
E
A
B
Because
the
questions
that
I
was
fielding
were
with
regard
to
things
like
stream
reader,
where,
like
I
read
from
the
stream
and
that
I
failed,
I
can't
unring
scream
again,
like
I,
have,
by
definition,
mutated
the
state
of
the
underlying
stream.
In
order
to
attempt
to
do
my
work
right
history,
their.
E
E
A
A
A
E
A
But
I
guess
an
option
is
to
general
expectation
is
that
the
party
like
the
options
type
themselves,
are
usually
not
in
a
position
to
validate
anything,
because
usually
you
can
set
things
independently
and
then
the
entry
point
is
usually
the
thing
that
you
actually
pass
the
options
to
and
then
that
that
part
is
usually
the
one
that
validates
that
the
combinations
of
options
you
passed
makes
sense
right.
I
mean.
E
A
E
E
A
E
Right,
so
to
keep
the
encoding
rules
as
the
decision
someone
has
to
make
to
the
reader.
Instead
of
having
that
rules
built
into
the
reader
options,
I
could
take
them
out
of
the
reader
options
and
then
just
make
this
or
change
the
shape
of
the
constructor
overload
to
take
a
rule
set
comma
and
options
and.
E
A
It
to
mean
the
most
logical
way
would
be
you
leave
the
rules
on
on
options
and
you
remove
the
constructor
that
takes
the
rules
themselves.
So
the
only
way
you
can
pass
stuff
in
is
by
options
and
options
are
optional,
so
you
can
just
say:
there's
the
default
option.
If
you
don't
like
them,
you
have
to
construct
them
and
set
them.
You
want
the
way
you
want.
It.
E
E
E
E
A
I
mean
to
me
that
I
mean
that's
a
player
that
feel
right,
I'm,
just
I'm,
just
judging
it
by
how
other
readers
work,
but
I
guess
most
of
the
readers
are
not
multi-format
right,
they're,
usually
single
format,
and
then
it's
like
well
you're.
Reading
XML.
You
already
know
that.
So
you
don't
you
don't
have
to
specify
that
much,
but
yeah.
B
E
E
B
E
Okay,
so
I
think
to
the
writer
I
guess
the
names
of
the
two,
the
two
things
on
the
reader
options
were
very
verbose
of
skip,
set,
sort,
order,
verification
and
UTC
time
two-digit
year
max
to
express
what
rule
they
serve
in
the
reader.
As
the
in
the
overloads
that
let
you
override
the
value
you
gave
them
the
option
they
use
a
they
don't
they're,
not
as
verbose,
because
there's
the
context
of
the
method
name.
E
E
E
E
A
E
And
we
could,
and
instead
of
copy
to,
if
it,
if
now
you're,
looking
at
it
you're
like
wow.
This
feels
really
weird:
it
could
be
removed
or
an
overload
to
write
encoded
value
which
would
change
the
source
and
destination,
and
so
it
would
be
destination,
dot.
Writing
coded
value.
This
met
up,
you
know,
yeah
and.
E
A
E
C
E
E
H
E
B
I
think
I'm
was
a
query
earlier,
who
mentioned
the
performance
concerns?
Yes,
because
there's
a
reset
method
on
this
writer,
you
could
actually
just
have
your
own
private
pool
of
these
or
you
could
have
a
like
a
thread,
static,
writer
and
just
reset
it
whenever
you
want
to
real
to
him
that
should
that
should
work,
just
fine,
so
you'd
still
be
able
to
use
these
high-level
api's
in
a
performance,
critical
scenario:
yes,
I
mean.
C
E
I
mean
it,
it
depends
on
what
you're
doing.
Certainly,
if
you
build
a
sign
CMS
with
an
embedded
payload
and
what
you've
signed
is
a
two
gig
file,
then
this
is
as
a
two
gig
buffer.
If
but,
if
you're,
building
a
certificate
that
comes
out
to
like
three
K,
so
the
expected
value
is
4,
K
or
less,
but
there
is
no
upper
bound
and.
A
That's
yeah
the
biggest
that
goes
back
to
correspond
right
like.
If
you
expect
this
to
be
in
a
hot
loop,
then,
if
the
typical
buffer
size
is
4
K,
then
that's
probably
not
going
to
be
acceptable
right.
If
you
expect
this
to
happen
like
a
thousand
times,
were
you
know
in
a
given
process
lifetime,
then
it's
probably
going
to
be
fine
right,
but
even.
B
E
A
A
A
E
E
It's
made
for
very
fast
readers.
This
this
is
in
coaching
set
is,
is
made
for
on
the
assumption
that
you
read
something
more
often
than
you
write.
It
I
see,
yeah
I,
guess
at
the
end,
so
everything's
length,
prepended
and
so
for
nested,
payload
types,
you
don't
know
what
the
length
is
until
you're
done.
A
It's
fear
like
I'm,
just
trying
to
assess
it
because
for
the
reader
we
basically
said:
okay,
we
have
a
static
helper
because
we
don't
want
to
give
people
a
rev
struck
beater,
but
if
they
ever
need
one
that
can
easily
build
one
right
here,
we
are
saying:
oh
no,
we
don't
need
that,
and
that
seems
just
like
the
surface.
At
least
you
know
inconsistent
right.
If
we,
if
we
believe
we
always
have
way
more
readers
and
writers
and
writers
are
not
performance,
critical,
then
I
think
that's
fine
and.
E
We
have
there
ways
that
we
could
deal
with
it
in
the
future
of
take
a
ibuffer
writer,
take
a
buffer,
add
static,
encode
methods
for
all
of
the
primitive
types
and
then
you're
on
your
own,
or
we
figure
something
else
out
for
the
nested
types
but
yeah
there.
There
is
growth
here
that
doesn't
require
returning
the
span.
C
A
It
also
different
somebody
made
my
mom
buy
a
low
level
right,
I
mean
memory,
stream
is
relatively
low
level
and
it
does
the
exact
same
thing.
I
did
basically
happily
allocates
for
you
I
think.
As
long
as
people
are
clear
that
that's
what
happens,
but
it
kind
of
as
I
said
earlier,
like
it
seems,
implied
because
you
you
don't
give
it
anything
right
so
till
it
has
to
sent
the
data
somewhere
right.
It
shouldn't
be
an
entirely
mystery
to
the
caller
that
this
thing
allocates.
E
So
all
the
push
methods
in
this
version
all
returned
scope.
Scope
is
a
nested
type
inside
the
writer,
it's
a
struct
that
is
I
disposable
and
has
no
other
public
members.
And
so
what
scope
does
is
when
you?
So
if
you
say
using
push
octet
string
and
when
it
when
that
using
exits,
it
calls
the
pop-pop-pop
octet
string
for
you
and
then
it's
safely
at
impotent
and
other
stuff.
E
A
E
E
A
For
symmetry
I
give
you
that
it
looks
nicer
to
have
both.
It
seems
odd
to
only
have
one,
but
then
again
it
seems
yep
a
little
bit
odd
to
have
both
at
the
same
time
when
people
like
am
I
expected
to
I
mean
it
might
not
be
clear
to
me,
but
that
they
push
dispose
and
pop
right,
because
that
seems
exactly
to
me
that
that
disposing
school
pops
right.
That's
the
other
thing,
I
guess
it's!
Maybe
it's
just
the
naming
but
yeah.
A
My
only
concern
is
that
people
need
to
know
that
that
is
what's
happening
right
and
so
that
don't
do
things
twice.
I
mean
granted.
It's
only
not
a
big
deal,
because
if
you
do
it
twice,
you
immediately
find
out
that
something
is
not
working
right.
So
it's
not
like
there's
a
sign
unexpected
back
in
your
program
that
you
will
find
very
late
right.
E
Yeah
like
if,
if
somebody
yeah
I
mean,
as
you
said,
emo
somebody
calls
it
so
if
they
call
it
inside
the
using
so
if
they
usually
using
and
they
call
it
inside
the
pop
or
the
disposed,
is
resilient
to
that.
If
they
do
it
in
the
wrong
order,
then
they'll
almost
immediately
get
an
exception.
As
they
were
author,
like
they
wrote
the
code,
they
tested
the
code.
It
blew
up
in
their
face
and
certainly
the
API
Doc's
that
I've
written
on
it
says
returns
a
thing
that
calls
pop
for
you
when
it's
disposed
yeah.
B
And
and
I
think
if
we
look
at
the
adjacent
serializer
or
the
jason
writer
as
a
pattern
to
follow
here,
I
believe
they
did
something
similar
where
the
there
are
multiple
ways
to
kind
of
close
an
object,
scope
but,
like
jeremy
said,
you'll
find
it
very
early
in
testing.
This
isn't
something
that's
going
to
bite
you
in
production,
unless
you
literally
never
tested
for
code.
E
E
And
then
yous
going
to
the
speck
again
and
find
the
bike
that
you
were
missing,
not
that
that's
ever
happened
to
me
so
all
of
the
Pusha
balls,
which
are
octet
string,
sequence
and
set
of
return,
the
same
opaque
scope,
value,
sorry,
the
same,
opaque
scope
type.
Certainly
it
has
a
different
value
and.
E
A
A
B
E
B
B
A
A
E
A
Yeah,
so
I
was
about
to
say
that
so
like
I.
Consider
at
this
point
we're
done
if
they
hasn't
be,
the
one
I
was
just
considered
it
approved.
The
way
we
usually
track
designs
is
that
we
approve
a
particular
snapshot
of
a
design
right
and,
if
later
on,
changes
need
to
be
made
as
a
separate
PR
and
it's
a
separate
approval
right,
that's
I
think
the
easiest
way
to
deal
with
that
and
yeah
I
guess.
Ideally,
this
would
have
not
been
a
comment,
but
just
a
PR
abut
didn't
guess.
E
I
A
A
I
So
last
week
we
discussed
this
so
this
this
issues
to
discuss
have
been
ignored,
default
value,
semantics
for
Jason
serializer.
Currently
we
have
ignore
no
value
but
no
way
to
apply
this
to
value
types.
So
if
you
scroll
all
the
way
to
the
last
comments,
there
was
some
feedback
last
week
regarding
whether
we
should
apply
to
this
realization,
so
the
gist
is
Steve
and
I
spoke
to
James
and
cake
shortly
after
the
meeting
on
Friday
and
the
feedback
was,
should
we
do
any
surprises.
This
realisation
doesn't
make
sense,
but
we
basically
said
hey.
I
We
know
sort
of
applied
the
semantics
for
Newton
soft
when
we
first
designed
ignore
no
values
so
wanted
to
be
sure
that
it
actually
needed
to
be
applied
to
this
realization.
So,
after
speaking
with
him,
couldn't
really
think
of
a
good
reason
why
we
should
which
reflects
some
of
the
concerns
from
API
review
last
week,
and
the
sentiment
is
that
most
people
probably
do
not
notice
that
it's
been
applied
or
required
for
it
to
be
applied.
So
that's
it.
I
So
the
first
thing
here
is,
we
just
ignore
condition
or
it
exists
today
we
have
never
win,
never
win
all
and
always
so
proposal
here
is
to
rename
when
know
to,
when
writing
default
values,
which
is
very
clear
that
so,
if
the
condition
is
set
to
this
petite
and
would
only
ignore
when
writing
novel
is
meaning
that,
if
knowledge
applied
on
the
serialization
would
apply,
it
I
mean
if
knowledge
in
period.
So
if
so
yeah
that's
the
first
thing.
So
if
we
scored
down
to
the
next
question,
is
no?
I
What
does
this
look
like
globally?
So
whether
we
use
this,
you
know
globally
as
well
see
we
have
a
default
signal
condition.
Initially,
a
name
is
a
default
ignore
condition.
So
this
determines
when
to
ignore
default
values,
realization
initialization,
so
we
have
the
same
same
options
and
default
to
be
just
never
meaning
that
would
always
he
relies
on
T
cell
as
default
values.
I
So
if
once
one
wanted
to
per
property,
ignore
a
value
on
a
sterilization,
if
it's
default,
then
do
it
set
it
to
when
rights
in
default
values.
So
this
is
nice
because
we're
able
to
add
when
reading
default
values
twenty-four
values
in
the
future,
if
we
ever
needed
an
insect
receipt,
so
the
final
thing,
what
the
proposal
was
to
make
it
no
default
values
obsolete
so
this
yeah.
So
this
initially
was
specific
to
no
values.
Now
we
have
a
more
generalized
thing
that
applies
to
transition
and
sterilization.
I
So
perhaps
we
don't
need
anymore,
especially
since
we're
concerned
about
inter
plane
to
this
realization
as
well.
The
I
do
plan
for
me
personally
would
be
to
make
these
so
put
obsoletes
for
this
release
and
then
in.net
six
remove
it
since,
like
the
library
is
fairly
new
and
then
you
know,
would
have
absolute
eight,
so
they
have
one
for
each
cycle
and
then
wouldn't
you
know,
advertise
this
option
and
just
have
people
start
toward
the
new
global
option
yeah.
So
that's!
E
A
A
But
I
think
that
design
makes
sense
to
me.
Does
anybody
have
any
concerns
with
them?
The
only
kind
of
where
I
was
hoping
we
would
land
yeah.
E
I
think
the
overall
shape
is
reasonable.
I
wonder
if
the
wind
riding
default
values
should
not
have
the
S
on
the
end
is
there?
It
applies
to
this
property
and
this
property's
default
value
or
as
the
default,
but
it's
for
every
particular
property,
its
default
value,
but
it's
not.
There
is
no
notion
of
plural
on
a
per
property
for
default.
E
E
Just
thinking
of
it
as
sitting
on
an
attribute
sitting
on
a
property
of
when
writing
default
values,
because
the
plural
doesn't
feel
to
me
like
it
applies
to
this
property.
So
it
feels
like
it's
a
mode
question
instead
of
the
value
question,
I
think
so
my
when
I
read
it
it.
It
feels
like
a
state
to
me
instead
of
a
value
comparison.
I
B
From
chat,
someone
suggested
what,
if
you
just
leave
off
the
value
suffix
entirely.
E
E
D
I
A
A
A
A
A
J
So,
on
top
of
the
reference
handling,
but
in
a
proposal
I
wanted
to
add
a
reference
resolver,
which
is
essentially
something
that
we
already
have
internally,
that
is
just
about
is
the
backup
references
where
we
have
all
the
where
we
keep
all
the
objects.
All
the
reference
type
objects
that
we
have
on
here.
We
found
on
serialization
or
visualization,
so.
J
So
when
they're,
what
I
want
to
do
is
to
expose
reference
reference
resolve
it
as
an
abstract
class
similar
to
web
nuta.
So
has,
and
a
few
reasons
for
this
is
that
someone
might
want
to
define
how
they
store
their
references.
For
example,
someone
wants
to
route
the
references
and,
and
they
can
achieve
that
by
use
creating
the
resolver
out
of
their
civilization.
The
state
say
they
can
use,
send
it
concurrently
to
the
city
later.
J
They
can
access
the
reference
resolver
and
interact
with
it
with
the
with
the
methods
proposed
and
also
this.
This
proposal
also
addresses
the
previous
video
that
we
had
about
changing
reference
handling
to
reference
handler
used
to
make
this
not
look
like
an
enum
and
more
like
a
class
to
sound
like
a
class
martin
indyk.
J
Basically,
I'm
just
okay
I'm,
adding
the
reference
resolver
class
with
the
port,
with
formatted
studies
to
interact
with
with
and
in
order
to
enable
that
I'm
I'm
also
adding
a
constructor
for
the
reference
standard
class
that
takes
a
takes
a
funk
and
in
that
phone
you
can
use
so
to
get
together.
You
get
the
references
to
nuts
root.
You
can
use
delegates
the
restaurants,
our
constructors,
with
a
funk
and
in
order
to
get
it,
get
that
reference
to
read
you
just
create
create
an
instance.
J
For
example,
here
someone
might
want
to
use
instead
of
int,
which
is
where
we
have
someone
like
one
just
to
use
good
for
data
use.
They
use
three
three
days
which
they
use
cast
the
string
on
the
obligation
into
the
GUI,
then
just
keep
it
on
manage
on
a
dictionary
and
to
meet
the
ID.
They
just
create
any
good
and
return
it
on
the
get
reference
method,
but.
H
H
F
J
J
B
It
sounds
like
for
each
each
time
I
call
serialized.
The
serializer
will
invoke
this
funk
to
get
a
potentially
fresh
instance
of
the
resolver
correct.
Yeah
no
state
is
passed
into
this
call
site.
Does
a
resolver
need
any
information
whatsoever
from
the
serializer
in
order
to
create
a
new
instance
of
itself.
A
B
J
There
was
a
consideration
is
to
know
to
pass
a
pool
just
to
know
when
you,
if
you
call
this
from
serialize
or
these
here
lies
just
you
know
what
what
diction,
as
you
want
to
you
want
to
initialize,
but
that
I
discussed
that
with
Assam
and
things
like
that's
like
not
really
necessary
and
just
a
little
bit
more
confusing.
That
necessary
right
also
is.
I
J
D
Particular
options
that
could
cause
you
know
essentially
memory
leak
because
the
options
are
probably
used
throughout.
You
know
the
executable
or
you
know,
AB
domain,
so
that
may
or
may
not
be
the
intent
to
share
the
same
references
across
everything
right,
but
we
don't
have
today
a
nice
way
to
scope
it
just
for
a
particular
entry
point.
That's
called
you
normally
call
it.
You
know:
Jason
serializer
does
serialize
or
deserialize
there's
no,
not
today
any
object
to
kind
of
hook
on
to
that
would
save
for
the
lifetime
of
only
this
serializer
deserialize.
D
I
want
to
preserve
references,
you're
missing,
that's
missing.
Today.
It
was
mentioned
mm
a
little
earlier
that
yeah
I
was
working
on
a
design
that
you
we
had
that
state
thing,
and
you
can
maybe
hook
up
to
that,
but
just
to
note
that
if
somebody
decides
to
create
you
know
their
own
static
or
something
tied
to
an
options
class,
they
could
get
into
trouble.
So
does.
H
A
D
A
I
mean
I
had
the
same
at
a
similar
feeling
like
to
me.
Raw
funks
are
nice.
If
you
really
absolutely
positively
sure
you
never
need
anything
more
right
as
soon
as
you
don't
want
to
pass
in
anything
else,
you're
kind
of
screwed
with
that
design
is
why
we'd
have
to
I
mean
you're,
not
entirely
screwed.
You
could
have
an
overload
to
Reference
Center
right
that
takes
funk
off
something
else
right,
but.
B
H
D
D
J
B
So
there
is,
there
is
a
potential
pit
of
failure
here
then,
where
right
now
we
expect
people
to
pass
within
the
funk
itself
like
open,
closed
paren
arrow
operator
new
by
resolver.
But
if
someone
says
bar
resolver
equals
new,
my
resolver
and
then
they
passed
open,
paren,
close
paren
arrow,
that
instance
that
I
instantiated
as
part
of
a
closure.
They
now
have
a
memory
link
inside
their
application
and
they
won't
notice
that
memory
leak
until
their
app
at
some
point
in
the
future
falls
on
the
floor
time
or.
H
J
A
Maybe
I'm
not
quite
understanding
it's
like,
but
but
if
even
if
you
were
to
return
a
static
right,
the
funk
is
still
scoped
to
this
instance
of
options.
But
if
I
drop
these
options
on
the
floor
and
I
create
I,
create
a
new
jason,
see
other
options
with
different
settings.
Then
I
also
don't
have
a
memory
leak,
but
I
only
have
memiliki
of
the
options
themselves
now
also
are
effectively
aesthetic
correct.
E
H
H
Sunscreen,
the
resolver
is
shared
across
all
instances
of
all
options
that
are
created
with
deserialize
people.
Sorry,
those
of
us
can
eat
it
one
time
so
this
D
sterilized
people
method
is
using
the
same
underscore
resolver
every
time
it
creates
right
for
every
operation,
that's
performed,
so
all
all
operations
from
now
until
eternity
that
call
deserialize
people
are
using
this
same
underscore.
Resolver
instance.
H
A
E
Going
to
be
called
concurrently,
because
I
mean
assume
that
this
was
a
bcl
method,
it's
static,
so
it's
thread-safe,
and
now
that
means
the
resolver
instance
head
to
that
instance,
which
normally
wouldn't
have
had
to
be
thread.
Safe,
does
have
to
be
thread
safe
in
order
to
preserve
the
thread.
Safety
of
the
static
method
right.
H
B
Not
necessarily
because
I
the
thing
is
we
we
want
to
make
it
easy
for
someone
to
do
the
common
case
and
possible
for
someone
to
do
the
uncommon
case,
but
not
we
don't
want
people
to
run
into
a
situation
where
we
force
them
to
use
a
complex
API
and
they
accidentally
get
it
wrong.
So
I
could
see
a
world
where
both
of
these
exists
both
the
easy
one
that
Steve
suggested
and
the
complex
one
that
David
just
talked
about.
E
A
I
B
B
D
D
So
if
you
have
a
funk
hanging
off
of
that
that
this
holds
state,
you
know
they're
kind
of
coupled
and
today
there
is
no
state
object
created
when
you
call
serialize
or
that
lets
you
pass
in
a
state
object.
But
if
that
was
added,
I
think
that
that
would
be.
You
know
the
place
that
you
would
want
to
tie
your
resolver
to
because
are
your
handler
to,
because
and
it'd
be
up
to
the
caller
to
say:
hey
I'm,
passing
in
this
special
state
that
I
want
to
preserve
between
multiple
calls
to
the
serializer.
D
A
And
pose
I
mean
my
gut
feel
is
that
the
funk
is
good
enough,
but
I
can
see
the
argument.
I
mean
like
move
like
the
second
example.
If
I
had,
rather
you
basically
closed
over
local
burger
won,
this
whole
thing
gets
hosted
somewhere
teams
also
in
the
general
case,
fine,
because
it
usually
means
it's
tied
to
the
invocation
of
that
method.
Right
I
mean
unless
that
method
is
due
to
the
entirety
of
your
program
where
effectively
the
hosted
instance
is
stacking
around
for
a
long
time.
It
also
seems
relatively
fine
I
mean.
A
J
So
actually
asp.net
step
into
that
issue
with
Newton
self,
because
they
was,
they
were
catching
the
Hastings
utilizer
itself,
as
an
instance
prefers,
and
by
catching
the
whole
distance
realized
today
else
they
are
also
catching
the
resolver.
So
every
time
to
do
any
request,
they
will
use,
keep,
they
will
just
keep
adding
to
the
resolver
over
and
over,
and
they
will.
They
will
eventually
reach
out
route
and
bound
memory.
Count
right,
part
of
homework.
A
B
J
H
A
A
Because,
if
you,
if
you
look
at
you
know
what
Levi
said
earlier
right,
if
in
the
context
of
asp
net-
and
you
start
up
method,
fung's
are
fairly
popular
or
fairly
common
right
so
like.
If
that's
and
that's
basically,
when
you
accidentally
close
over
a
local,
then
you
really
kill
yourself
right
and
I
think
that's
where
my
concern
is
because
in
ASP
nets
in
the
in
the
configuration
thing
like
everything
home
like
a
lot
of
things,
take
phones,
but
it's
a
fairly
common
pattern
there.
A
H
A
E
We
could
also
have
so
get
rid
of
the
public
constructor
once
we're
having
the
static
creates,
but
the
reference
handler
dot.
Creative
T,
which
takes
takes
the
T
as
a
T
with
a
constraint
of
new
and
has
no
arguments
and
reference
Handler
dot
create
manually,
which
takes
a
hunk
reference
resolver.
So
you
had
to
write
the
word
manually
before
you
get
to
the
one
that
takes
the
lambda
yeah
or.
A
B
What
reference
handler
becomes
abstract?
You
create
a
concrete
sealed
implementation,
reference
handler
of
T
constrained,
the
T
to
both
reference,
resolver
and
new,
and
if
I
really
want
to
customize
how
these
things
are
created,
I
sub
class
reference
Handler
and
override
the
create
resolver
method.
Oh
yes,.
A
B
B
A
J
So
you're
suggesting
to
make
okay,
so
you
make
abstract
reference
Handler
and
until
someone
wants
to
use
this
custom
preserves,
they
need
to
inherit
small
reference
handler
right
and
but
I
mean
we
consider
I
can
see
your
mouth
merging
or
doing
abstract
there's
another
class
and
get
rid
of
reference.
Resolver
I
mean
like
just
moving
the
methods
to
reference
country,
but
then,
if
you
add
something
else
to
reference
all
this,
it
wouldn't
make
sense.
E
You
want
to
do.
I
have
custom
options
that
need
to
go
into
my
resolver
or
anything
weird.
Then
you
would
extend
reference
handler
so
that
in
your
create
resolver,
you
can
do
whatever
complicated
things
you
needed
to.
But
if
you
just
want
the
easy
thing
you
would
say
your
handler
was
reference
handler
of
gooood
resolver.
Okay,.
J
A
J
Wait
but
then
again,
let's
assume
that
in
the
future
we
discussed
before
the
we,
some
people
might
want
to
a
big
nerd
option.
So
if
you
want
to
I,
don't
know,
for
example,
if
you
want
to
have
reference
cancer
with
ignore,
and
then
you
have
these
two
reference,
that's
all
what
about
create!
Well,
I!
Guess
you
can
return,
no
I
mean
you
can
just
overwrite
it
to
return
all
in
just
enabling,
nor
in
case
we
are
ignoring
the
feature.
Does
anything
what.
J
B
J
J
E
A
B
B
Oh,
why
wouldn't
it
be
public?
Why
would
it
be
hello
because,
if
you're,
if
I'm
creating
my
own,
if
I'm
customizing,
the
serializer
I,
might
need
to
call
this
in
order
to
get
a
reference
handler,
what
I,
not
or
in
order
to
get
to
the
solver
right,
neutralizer
sure,
if
I'm
writing
my
own
serializer
or
if,
in
the
future,
we
ever
intend
on
adding
extensibility
hubs,
materializer,
okay,.
E
E
A
H
H
B
H
A
Let
me
do
a
channel,
isn't
isn't
the
idea
that
the
resolver
is
the
party
that
decides
what
that
string
is
right?
Basically,
you
you're
calling
get
reference,
and
then
I
say
this
is
the
string
representation
right
in
my
good
example,
it's
the
two
string
version
of
the
couid,
the
default
one
would
use
two
two
string
of
an
end
and
whatever
other
encoding
I
want
to
have
for
my
instances.
That's
basically
what
I
am
responsible
for
right.
The
resolver
is
the
one
deciding
what
the
string
is.
B
J
C
E
E
I
mean
the
thing
for
the
highest
per
that
you
would
want
would
be
the
of
the
read-only
span
of
byte,
but
then
somebody
would
have
to
run
it
through
an
escape
to
to
work
out
the
Jason
escaping
if
they,
because
you
could
write
I
mean
something
could
come
in
from
the
wire.
We're
literally
every
character
uses
the
backslash,
hew
syntax
and
that's
legal
yeah.
So
it
needs
to
handle
that
so
I
don't
think
we
can
really
do
better
than
the
string
and
still
have
any
modicum
of
usability.
B
E
A
D
B
E
Or
nothing
and
it
references
either
or
usually
going
to
be
returning
if
it's
from
entity
framework
and
it's
the
primary
keys
and
it's
probably
pre
calculated,
so
it's
not
actually
allocating
anything
to
return.
If
it's
doing
a
dictionary,
try
get
value,
then,
if
you,
what
you
stored
was
the
key
or
the
string
form,
then
then
you've
already
computed
that
so
there's
a
lot
of.
Even
if
you
hit
this
a
thousand
times,
it's
not
necessarily
that
you're
calling
in
that
to
string
a
thousand
times
you
can
like.
That's
on.
You
know.
A
E
J
J
B
E
E
E
C
E
J
E
J
D
You
know
today
we
create
a
new
integer,
every
single
you
know
run
through
and
you
and
depending
on
your
object,
graph
you'll
get
different
integers,
for
you
know
the
same
object
or,
and
by
using
this
feature
with
a
common
cache
on
that
you
can
control,
you
can
preserve
the
IDs
across
multiple
calls.
Yes,.
E
J
The
memory
the
memory
memory
says
that
they
need
for
when
they
do
multiple
civilizations,
they
thought
they
they
don't
send
the
whole
object.
You
know
in
a
whole
payload
station
or
multiple
one.
So
in
order
to
know
what
the
reference
were
on
the
on
the
multiple
caster,
they
did,
they
choose
to
preserve
the
references.
E
J
J
B
B
But
I
mean
this:
if,
if
I'm
serializing
something
using
this
feature,
presumably
I
have
reference
types,
not
value
types.
So
this
means
potentially
that
going
back
to
two
I
think
Steve's
argument
about
performance
earlier
should
getting
the
ID
of
a
particular
object
be
deferred
until
it's
actually
necessary.
So.
J
G
J
Since
that's
different
from
Newton's
us-
and
maybe
someone
wants
to
wants
to
know
if
something
is
reference
before
taking
action,
I
split
split
the
cows
into
two
methods,
so
that's
more
user-friendly,
regular
I
guess
so,
maybe
if
otherwise,
if
someone
calls
get
reference
and
they
might
end
up,
are
we
starting
the?
Are
you
look
for
the
object,
which
is
probably
something
that
might
or
might
not
want
always.
J
I
have
parentheses
in
the
proposal
where
I,
what
I
exactly
did
what
you
were
mentioning
so,
instead
of
having
it
reference
and
as
an
each
reference
is
they
get
ringgit
reference
object.
Value
will
already
exist,
but
that
said
that,
now
you,
you
cannot
look
up
for
the
reference
without
adding
to
the
dictionary.
E
J
J
E
Now
I
think,
unless
we
can
come
up
with
a
scenario
where
it's
important
to
have
them
in
two
methods.
I
think
I
mean
again
if
you're
using
this
performance
is
obviously
not
your
highest
goal,
but
that
custom
equality
comparisons
can
be
expensive
and
so
double
dipping.
The
dictionary
is
not
necessarily
a
good
idea.
I
see
you
so
I
would
I
would
recommend
making
it
get
reference
making
it
reference
return
both
things
and
it
feels
like
the
most
natural
representation
of
that
is
adding
an
out
pool
on
or
to
what
you
currently
have.
Okay,.